summaryrefslogtreecommitdiffstats
path: root/writerperfect
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 16:51:28 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 16:51:28 +0000
commit940b4d1848e8c70ab7642901a68594e8016caffc (patch)
treeeb72f344ee6c3d9b80a7ecc079ea79e9fba8676d /writerperfect
parentInitial commit. (diff)
downloadlibreoffice-940b4d1848e8c70ab7642901a68594e8016caffc.tar.xz
libreoffice-940b4d1848e8c70ab7642901a68594e8016caffc.zip
Adding upstream version 1:7.0.4.upstream/1%7.0.4upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'writerperfect')
-rw-r--r--writerperfect/AllLangMoTarget_wpt.mk13
-rw-r--r--writerperfect/CppunitTest_writerperfect_calc.mk42
-rw-r--r--writerperfect/CppunitTest_writerperfect_draw.mk39
-rw-r--r--writerperfect/CppunitTest_writerperfect_epubexport.mk48
-rw-r--r--writerperfect/CppunitTest_writerperfect_import.mk41
-rw-r--r--writerperfect/CppunitTest_writerperfect_impress.mk39
-rw-r--r--writerperfect/CppunitTest_writerperfect_stream.mk59
-rw-r--r--writerperfect/CppunitTest_writerperfect_wpftimport.mk56
-rw-r--r--writerperfect/CppunitTest_writerperfect_writer.mk43
-rw-r--r--writerperfect/IwyuFilter_writerperfect.yaml202
-rw-r--r--writerperfect/Library_wpftcalc.mk70
-rw-r--r--writerperfect/Library_wpftdraw.mk85
-rw-r--r--writerperfect/Library_wpftimpress.mk63
-rw-r--r--writerperfect/Library_wpftqahelper.mk43
-rw-r--r--writerperfect/Library_wpftwriter.mk113
-rw-r--r--writerperfect/Library_writerperfect.mk60
-rw-r--r--writerperfect/Makefile14
-rw-r--r--writerperfect/Module_writerperfect.mk54
-rw-r--r--writerperfect/README6
-rw-r--r--writerperfect/UIConfig_writerperfect.mk27
-rw-r--r--writerperfect/UITest_writerperfect_epubexport.mk16
-rw-r--r--writerperfect/inc/DirectoryStream.hxx67
-rw-r--r--writerperfect/inc/DocumentHandler.hxx65
-rw-r--r--writerperfect/inc/DocumentHandlerFor.hxx25
-rw-r--r--writerperfect/inc/DocumentHandlerForOdg.hxx27
-rw-r--r--writerperfect/inc/DocumentHandlerForOdp.hxx27
-rw-r--r--writerperfect/inc/DocumentHandlerForOds.hxx27
-rw-r--r--writerperfect/inc/DocumentHandlerForOdt.hxx27
-rw-r--r--writerperfect/inc/ImportFilter.hxx180
-rw-r--r--writerperfect/inc/WPFTEncodingDialog.hxx48
-rw-r--r--writerperfect/inc/WPFTResMgr.hxx12
-rw-r--r--writerperfect/inc/WPXSvInputStream.hxx62
-rw-r--r--writerperfect/inc/strings.hrc26
-rw-r--r--writerperfect/inc/writerperfectdllapi.h23
-rw-r--r--writerperfect/qa/uitest/epubexport/epubexport.py142
-rw-r--r--writerperfect/qa/unit/DirectoryStreamTest.cxx148
-rw-r--r--writerperfect/qa/unit/DrawingImportTest.cxx156
-rw-r--r--writerperfect/qa/unit/EPUBExportTest.cxx880
-rw-r--r--writerperfect/qa/unit/ImportTest.cxx119
-rw-r--r--writerperfect/qa/unit/PresentationImportTest.cxx156
-rw-r--r--writerperfect/qa/unit/SpreadsheetImportTest.cxx138
-rw-r--r--writerperfect/qa/unit/TextImportTest.cxx145
-rw-r--r--writerperfect/qa/unit/WPXSvStreamTest.cxx355
-rw-r--r--writerperfect/qa/unit/WpftCalcFilterTest.cxx61
-rw-r--r--writerperfect/qa/unit/WpftDrawFilterTest.cxx76
-rw-r--r--writerperfect/qa/unit/WpftFilterFixture.cxx35
-rw-r--r--writerperfect/qa/unit/WpftFilterFixture.hxx88
-rw-r--r--writerperfect/qa/unit/WpftFilterTestBase.cxx62
-rw-r--r--writerperfect/qa/unit/WpftFilterTestBase.hxx70
-rw-r--r--writerperfect/qa/unit/WpftImpressFilterTest.cxx62
-rw-r--r--writerperfect/qa/unit/WpftLoader.cxx208
-rw-r--r--writerperfect/qa/unit/WpftLoader.hxx103
-rw-r--r--writerperfect/qa/unit/WpftWriterFilterTest.cxx76
-rw-r--r--writerperfect/qa/unit/data/calc/libetonyek/fail/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/calc/libetonyek/indeterminate/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/calc/libetonyek/pass/Numbers_2.numbersbin0 -> 113709 bytes
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/fail/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/indeterminate/GreatWorks_1.0.hqx61
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/indeterminate/GreatWorks_2.0.hqx125
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/indeterminate/GreatWorks_DB_1.0.hqx115
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/indeterminate/GreatWorks_DB_2.0.hqx222
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/pass/BeagleWorks_1.0.hqx45
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/pass/BeagleWorks_DB_1.0.hqx176
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisResolve_1.0.hqx43
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_2.0.hqx102
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_4.0.hqx160
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_5.0.cwkbin0 -> 11256 bytes
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_6.0.cwkbin0 -> 24176 bytes
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_DB.cwkbin0 -> 14607 bytes
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_DB_2.0.hqx95
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_DB_4.0.hqx134
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_DB_5.0.cwkbin0 -> 10691 bytes
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/pass/MicrosoftWorks_2.0.hqx45
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/pass/MicrosoftWorks_3.0.hqx54
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/pass/MicrosoftWorks_4.0.wk4bin0 -> 5632 bytes
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/pass/MicrosoftWorks_DB_2.0.hqx20
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/pass/MicrosoftWorks_DB_3.0.hqx266
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/pass/MicrosoftWorks_DB_4.0.wdbbin0 -> 10240 bytes
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/pass/Multiplan_1.hqx46
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/pass/Wingz_1.0.hqx28
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/pass/WordPerfectWorks_1.0.hqx45
-rw-r--r--writerperfect/qa/unit/data/calc/libmwaw/pass/WordPerfectWorks_DB_1.0.hqx176
-rw-r--r--writerperfect/qa/unit/data/calc/libstaroffice/fail/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/calc/libstaroffice/indeterminate/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/calc/libstaroffice/pass/Calc_3.1.sdcbin0 -> 11776 bytes
-rw-r--r--writerperfect/qa/unit/data/calc/libwps/fail/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/calc/libwps/indeterminate/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/calc/libwps/pass/Lotus.wk1bin0 -> 1503 bytes
-rw-r--r--writerperfect/qa/unit/data/calc/libwps/pass/Lotus123_3.123bin0 -> 30352 bytes
-rw-r--r--writerperfect/qa/unit/data/calc/libwps/pass/Lotus123_98.123bin0 -> 7616 bytes
-rw-r--r--writerperfect/qa/unit/data/calc/libwps/pass/Multiplan_3bin0 -> 2612 bytes
-rw-r--r--writerperfect/qa/unit/data/calc/libwps/pass/QuattroPro.wb1bin0 -> 174166 bytes
-rw-r--r--writerperfect/qa/unit/data/calc/libwps/pass/QuattroPro.wq1bin0 -> 3540 bytes
-rw-r--r--writerperfect/qa/unit/data/calc/libwps/pass/Works_2.0.wdbbin0 -> 1276 bytes
-rw-r--r--writerperfect/qa/unit/data/calc/libwps/pass/Works_2.0.wksbin0 -> 1281 bytes
-rw-r--r--writerperfect/qa/unit/data/calc/libwps/pass/Works_Windows.wdbbin0 -> 5632 bytes
-rw-r--r--writerperfect/qa/unit/data/calc/libwps/pass/Works_Windows.wksbin0 -> 2295 bytes
-rw-r--r--writerperfect/qa/unit/data/draw/libcdr-cmx/fail/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/draw/libcdr-cmx/indeterminate/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/draw/libcdr-cmx/pass/fdo63782-1.cmxbin0 -> 35772 bytes
-rw-r--r--writerperfect/qa/unit/data/draw/libcdr/fail/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/draw/libcdr/fail/EDB-35217-1.cdrbin0 -> 10900 bytes
-rw-r--r--writerperfect/qa/unit/data/draw/libcdr/indeterminate/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/draw/libcdr/pass/EDB-35217-2.cdrbin0 -> 10900 bytes
-rw-r--r--writerperfect/qa/unit/data/draw/libcdr/pass/fdo65220-2.cdrbin0 -> 10755 bytes
-rw-r--r--writerperfect/qa/unit/data/draw/libfreehand/fail/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/draw/libfreehand/indeterminate/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/draw/libfreehand/pass/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/draw/libmspub/fail/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/draw/libmspub/indeterminate/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/draw/libmspub/pass/EDB-22310-1.pubbin0 -> 577536 bytes
-rw-r--r--writerperfect/qa/unit/data/draw/libmspub/pass/EDB-22655-1.pubbin0 -> 577536 bytes
-rw-r--r--writerperfect/qa/unit/data/draw/libmspub/pass/EDB-29664-1.pubbin0 -> 89600 bytes
-rw-r--r--writerperfect/qa/unit/data/draw/libmspub/pass/fdo59355-1.pubbin0 -> 10752 bytes
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/fail/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/indeterminate/GreatWorks_1.0.hqx44
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/indeterminate/GreatWorks_2.0.hqx104
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/indeterminate/GreatWorks_P_1.0.hqx98
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/BeagleWorks_1.0.hqx104
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/BeagleWorks_P_1.0.hqx427
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/ClarisDraw.hqx160
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/ClarisWorks_2.0.hqx161
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/ClarisWorks_4.0.hqx181
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/ClarisWorks_5.0.cwkbin0 -> 195344 bytes
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/ClarisWorks_6.0.cwkbin0 -> 198376 bytes
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/CorelPainter_10bin0 -> 178980 bytes
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/CorelPainter_3_win.rifbin0 -> 1944 bytes
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/CricketDraw_1.0.hqx133
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/CricketDraw_1.1.hqx72
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/FreeHand_1.0.hqx75
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/FreeHand_2.0.hqx49
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/MacDraft_1.0.hqx134
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/MacDraft_5.5.drwbin0 -> 62079 bytes
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/MacDraw_0.hqx9
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/MacDraw_1.hqx103
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/MacDraw_II.hqx110
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/MacDraw_Pro_1.0.hqx109
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/MacPaint_1.0.hqx72
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/MacPaint_2.0.hqx116
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/MicrosoftWorks_3.0.hqx27
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/MicrosoftWorks_4.0.mswbin0 -> 10752 bytes
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/SuperPaint_1.0.hqx27
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/SuperPaint_P_1.0.hqx71
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/WordPerfectWorks_1.0.hqx104
-rw-r--r--writerperfect/qa/unit/data/draw/libmwaw/pass/WordPerfectWorks_P_1.0.hqx137
-rw-r--r--writerperfect/qa/unit/data/draw/libpagemaker/fail/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/draw/libpagemaker/indeterminate/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/draw/libpagemaker/pass/shapes.pmdbin0 -> 96256 bytes
-rw-r--r--writerperfect/qa/unit/data/draw/libstaroffice/fail/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/draw/libstaroffice/indeterminate/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/draw/libstaroffice/pass/Draw_3.1.sdabin0 -> 23040 bytes
-rw-r--r--writerperfect/qa/unit/data/draw/libvisio/fail/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/draw/libvisio/indeterminate/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/draw/libvisio/pass/EDB-22679-1.vsdbin0 -> 681984 bytes
-rw-r--r--writerperfect/qa/unit/data/draw/libvisio/pass/fdo57117-1.vsdbin0 -> 11264 bytes
-rw-r--r--writerperfect/qa/unit/data/draw/libwpg/fail/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/draw/libwpg/indeterminate/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/draw/libwpg/pass/WPG1.wpgbin0 -> 79 bytes
-rw-r--r--writerperfect/qa/unit/data/draw/libzmf/fail/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/draw/libzmf/indeterminate/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/draw/libzmf/pass/ZonerDraw_5.zmfbin0 -> 1408 bytes
-rw-r--r--writerperfect/qa/unit/data/import/SOLVE.FM3bin0 -> 1827 bytes
-rw-r--r--writerperfect/qa/unit/data/import/SOLVE.WK3bin0 -> 10772 bytes
-rw-r--r--writerperfect/qa/unit/data/impress/libetonyek/fail/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/impress/libetonyek/indeterminate/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/impress/libetonyek/pass/Keynote_1.keybin0 -> 1252706 bytes
-rw-r--r--writerperfect/qa/unit/data/impress/libetonyek/pass/Keynote_2.keybin0 -> 335906 bytes
-rw-r--r--writerperfect/qa/unit/data/impress/libetonyek/pass/Keynote_3.keybin0 -> 6972479 bytes
-rw-r--r--writerperfect/qa/unit/data/impress/libetonyek/pass/Keynote_4.keybin0 -> 7340562 bytes
-rw-r--r--writerperfect/qa/unit/data/impress/libetonyek/pass/Keynote_5.keybin0 -> 2210218 bytes
-rw-r--r--writerperfect/qa/unit/data/impress/libetonyek/pass/Keynote_6.keybin0 -> 379391 bytes
-rw-r--r--writerperfect/qa/unit/data/impress/libmwaw/fail/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/impress/libmwaw/indeterminate/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/impress/libmwaw/pass/ClarisWorks_6.0.cwkbin0 -> 16880 bytes
-rw-r--r--writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_2.pptbin0 -> 3708 bytes
-rw-r--r--writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_3.pptbin0 -> 8861 bytes
-rw-r--r--writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_4.pptbin0 -> 33792 bytes
-rw-r--r--writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_7.pptbin0 -> 169472 bytes
-rw-r--r--writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_Mac_148
-rw-r--r--writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_Mac_2bin0 -> 1892 bytes
-rw-r--r--writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_Mac_3101
-rw-r--r--writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_Mac_4.pptbin0 -> 15872 bytes
-rw-r--r--writerperfect/qa/unit/data/stream/fdo40686-1.docbin0 -> 12288 bytes
-rw-r--r--writerperfect/qa/unit/data/stream/test.dir/META-INF/manifest.xml1
-rw-r--r--writerperfect/qa/unit/data/stream/test.dir/Thumbnails/thumbnail.png1
-rw-r--r--writerperfect/qa/unit/data/stream/test.dir/content.xml1
-rw-r--r--writerperfect/qa/unit/data/stream/test.dir/manifest.rdf1
-rw-r--r--writerperfect/qa/unit/data/stream/test.dir/meta.xml1
-rw-r--r--writerperfect/qa/unit/data/stream/test.dir/mimetype1
-rw-r--r--writerperfect/qa/unit/data/stream/test.dir/settings.xml1
-rw-r--r--writerperfect/qa/unit/data/stream/test.dir/styles.xml1
-rw-r--r--writerperfect/qa/unit/data/stream/test.odtbin0 -> 8486 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/2pages.fodt14
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/abi11105.abw200
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/char-namedstyle.fodt16
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/escape.fodt16
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/font-embedding.fodt2657
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/footnote.fodt8
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/fxl-2page.fodt78
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/hello.fodt8
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/image-border.fodt36
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/image-link.fodt37
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/image-nospan.fodt33
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/image.fodt28
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/line-break.fodt20
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/link-charformat.fodt13
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/link-invalid.odtbin0 -> 9554 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/link-namedcharformat.fodt13
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/link.fodt8
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/list.fodt36
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/meta-xmp.fodt14
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/meta-xmp/metadata.xmp28
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/meta.fodt14
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/meta/cover.pngbin0 -> 766 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/named-style-inheritance.fodt39
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/nested-span.fodt21
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/outline-level.fodt15
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/para-autostyle-char-props.fodt21
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/para-char-props.fodt16
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/para-namedstyle.fodt18
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/popup-api.odtbin0 -> 10103 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/popup-media.odtbin0 -> 10111 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/popup-media/libreoffice.pngbin0 -> 714 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/popup.odtbin0 -> 10103 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/popup/libreoffice.pngbin0 -> 714 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/section.fodt12
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/simple-ruby.odtbin0 -> 8307 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/span-autostyle.fodt19
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/table-cell-border.fodt48
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/table-cell-width.fodt45
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/table-row-height.fodt42
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/table-row-span.fodt42
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/table-width.fodt28
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/table.fodt39
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/tdf115623-many-pagespans.odtbin0 -> 8591 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/tdf115623-single-writing-mode.odtbin0 -> 8562 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/tdf115623-split-by-chapter.odtbin0 -> 9346 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/text-box.fodt48
-rw-r--r--writerperfect/qa/unit/data/writer/libabw/fail/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/writer/libabw/indeterminate/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/writer/libabw/pass/hello.abw32
-rw-r--r--writerperfect/qa/unit/data/writer/libabw/pass/hello.zabwbin0 -> 1128 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libe-book/fail/TCR.tcrbin0 -> 288 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libe-book/indeterminate/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/writer/libe-book/pass/Broad_Band_eBook.lrfbin0 -> 1477 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libe-book/pass/FictionBook2.fb226
-rw-r--r--writerperfect/qa/unit/data/writer/libe-book/pass/FictionBook2.fb2.zipbin0 -> 472 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libe-book/pass/PalmDOC.pdbbin0 -> 135 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libe-book/pass/PeanutPress.pdbbin0 -> 419 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libe-book/pass/Plucker.pdbbin0 -> 4838 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libe-book/pass/TealDoc.pdbbin0 -> 4182 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libe-book/pass/zTXT.pdbbin0 -> 4594 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libetonyek/fail/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/writer/libetonyek/indeterminate/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/writer/libetonyek/pass/Pages_4.pagesbin0 -> 42277 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libetonyek/pass/Pages_5.pagesbin0 -> 57362 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/fail/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/indeterminate/GreatWorks_v2.hqx180
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/Acta_1.0.hqx24
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/BeagleWorks_v1.hqx49
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/ClarisWorks_1.0bin0 -> 7716 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/ClarisWorks_2.0bin0 -> 7779 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/ClarisWorks_6.0.cwkbin0 -> 55179 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/DOCMaker_4.hqx1496
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/FullWrite_1.0bin0 -> 9688 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/FullWrite_2.0bin0 -> 3274 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/HanMac_2.0.4J.hqx178
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/HanMac_2.0.6K.hqx94
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/LightWayText_4.0.hqx16
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/MacDoc_1.0.hqx41
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/MacWrite_4.5bin0 -> 5174 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/MacWrite_Pro1.0bin0 -> 14848 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/MarinerWrite_1.6L.hqx222
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/MarinerWrite_3.5.hqxbin0 -> 57068 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/MaxWrite_1.hqx12
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/MicrosoftWord_1.0bin0 -> 3456 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/MicrosoftWord_3.0bin0 -> 1024 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/MicrosoftWord_5.0bin0 -> 40960 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/MicrosoftWorks_1.0bin0 -> 46158 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/MicrosoftWorks_2.0bin0 -> 14490 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/MindWrite_2.1bin0 -> 3402 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/More.hqx123
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/MouseWrite_1.hqx58
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/NisusWriter_4.0.hqx206
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/RagTime_2.1.hqx24
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/RagTime_3.2.hqx136
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/RagTime_5.5.ragbin0 -> 14652 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/SimpleText_1.0.hqx11
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/TexEdit_2.0.hqx14
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/WriteNow_2.0bin0 -> 2632 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/WriteNow_4.0bin0 -> 23755 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/WriterPlusbin0 -> 8918 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libmwaw/pass/eDoc_2.0.hqx29
-rw-r--r--writerperfect/qa/unit/data/writer/libstaroffice/fail/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/writer/libstaroffice/indeterminate/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/writer/libstaroffice/pass/Writer_3.1.sdwbin0 -> 10752 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libwpd/fail/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/writer/libwpd/indeterminate/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/writer/libwpd/pass/CVE-2007-1735-1.wpdbin0 -> 1504 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libwpd/pass/CVE-2015-1759-1.wpdbin0 -> 26162 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libwpd/pass/CVE-2015-1760-1.wpdbin0 -> 25459 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libwpd/pass/CVE-2015-1760-2.wpdbin0 -> 17845 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libwpd/pass/EDB-14344-1.wpdbin0 -> 2810 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libwpd/pass/WP1.wpdbin0 -> 64 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libwpd/pass/WP3.wpdbin0 -> 504 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libwpd/pass/WP4.wpbin0 -> 211 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libwpd/pass/WP5.wpbin0 -> 885 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libwpd/pass/WP6.wpdbin0 -> 3587 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libwps/fail/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/writer/libwps/indeterminate/.gitignore0
-rw-r--r--writerperfect/qa/unit/data/writer/libwps/pass/Word_5.0_DOS.docbin0 -> 7168 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libwps/pass/Works_2.00A_DOS.wpsbin0 -> 660 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libwps/pass/Works_3.0.wpsbin0 -> 3584 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libwps/pass/Works_4.5.wpsbin0 -> 4608 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libwps/pass/Works_5.0.wpsbin0 -> 6144 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libwps/pass/Works_6.0.wpsbin0 -> 13824 bytes
-rw-r--r--writerperfect/qa/unit/data/writer/libwps/pass/Write_3.1.wribin0 -> 176896 bytes
-rw-r--r--writerperfect/qa/unit/stream.cxx16
-rw-r--r--writerperfect/qa/unit/wpftimport.cxx29
-rw-r--r--writerperfect/qa/unit/wpftimport.hxx33
-rw-r--r--writerperfect/qa/unit/wpftqahelperdllapi.h24
-rw-r--r--writerperfect/source/calc/MSWorksCalcImportFilter.cxx471
-rw-r--r--writerperfect/source/calc/MSWorksCalcImportFilter.hxx48
-rw-r--r--writerperfect/source/calc/MWAWCalcImportFilter.cxx124
-rw-r--r--writerperfect/source/calc/MWAWCalcImportFilter.hxx43
-rw-r--r--writerperfect/source/calc/NumbersImportFilter.cxx65
-rw-r--r--writerperfect/source/calc/NumbersImportFilter.hxx43
-rw-r--r--writerperfect/source/calc/StarOfficeCalcImportFilter.cxx99
-rw-r--r--writerperfect/source/calc/StarOfficeCalcImportFilter.hxx44
-rw-r--r--writerperfect/source/calc/wpftcalc.component32
-rw-r--r--writerperfect/source/common/DirectoryStream.cxx221
-rw-r--r--writerperfect/source/common/DocumentHandler.cxx182
-rw-r--r--writerperfect/source/common/WPFTEncodingDialog.cxx121
-rw-r--r--writerperfect/source/common/WPXSvInputStream.cxx969
-rw-r--r--writerperfect/source/draw/CDRImportFilter.cxx60
-rw-r--r--writerperfect/source/draw/CDRImportFilter.hxx42
-rw-r--r--writerperfect/source/draw/CMXImportFilter.cxx60
-rw-r--r--writerperfect/source/draw/CMXImportFilter.hxx42
-rw-r--r--writerperfect/source/draw/FreehandImportFilter.cxx56
-rw-r--r--writerperfect/source/draw/FreehandImportFilter.hxx39
-rw-r--r--writerperfect/source/draw/MSPUBImportFilter.cxx56
-rw-r--r--writerperfect/source/draw/MSPUBImportFilter.hxx39
-rw-r--r--writerperfect/source/draw/MWAWDrawImportFilter.cxx116
-rw-r--r--writerperfect/source/draw/MWAWDrawImportFilter.hxx44
-rw-r--r--writerperfect/source/draw/PageMakerImportFilter.cxx56
-rw-r--r--writerperfect/source/draw/PageMakerImportFilter.hxx40
-rw-r--r--writerperfect/source/draw/QXPImportFilter.cxx60
-rw-r--r--writerperfect/source/draw/QXPImportFilter.hxx39
-rw-r--r--writerperfect/source/draw/StarOfficeDrawImportFilter.cxx101
-rw-r--r--writerperfect/source/draw/StarOfficeDrawImportFilter.hxx45
-rw-r--r--writerperfect/source/draw/VisioImportFilter.cxx56
-rw-r--r--writerperfect/source/draw/VisioImportFilter.hxx39
-rw-r--r--writerperfect/source/draw/WPGImportFilter.cxx62
-rw-r--r--writerperfect/source/draw/WPGImportFilter.hxx44
-rw-r--r--writerperfect/source/draw/ZMFImportFilter.cxx60
-rw-r--r--writerperfect/source/draw/ZMFImportFilter.hxx39
-rw-r--r--writerperfect/source/draw/wpftdraw.component67
-rw-r--r--writerperfect/source/impress/KeynoteImportFilter.cxx247
-rw-r--r--writerperfect/source/impress/KeynoteImportFilter.hxx44
-rw-r--r--writerperfect/source/impress/MWAWPresentationImportFilter.cxx104
-rw-r--r--writerperfect/source/impress/MWAWPresentationImportFilter.hxx45
-rw-r--r--writerperfect/source/impress/StarOfficePresentationImportFilter.cxx102
-rw-r--r--writerperfect/source/impress/StarOfficePresentationImportFilter.hxx45
-rw-r--r--writerperfect/source/impress/wpftimpress.component27
-rw-r--r--writerperfect/source/writer/AbiWordImportFilter.cxx58
-rw-r--r--writerperfect/source/writer/AbiWordImportFilter.hxx43
-rw-r--r--writerperfect/source/writer/EBookImportFilter.cxx114
-rw-r--r--writerperfect/source/writer/EBookImportFilter.hxx44
-rw-r--r--writerperfect/source/writer/EPUBExportDialog.cxx223
-rw-r--r--writerperfect/source/writer/EPUBExportDialog.hxx64
-rw-r--r--writerperfect/source/writer/EPUBExportFilter.cxx205
-rw-r--r--writerperfect/source/writer/EPUBExportFilter.hxx83
-rw-r--r--writerperfect/source/writer/EPUBExportUIComponent.cxx102
-rw-r--r--writerperfect/source/writer/EPUBExportUIComponent.hxx84
-rw-r--r--writerperfect/source/writer/EPUBPackage.cxx216
-rw-r--r--writerperfect/source/writer/EPUBPackage.hxx102
-rw-r--r--writerperfect/source/writer/MSWorksImportFilter.cxx154
-rw-r--r--writerperfect/source/writer/MSWorksImportFilter.hxx44
-rw-r--r--writerperfect/source/writer/MWAWImportFilter.cxx117
-rw-r--r--writerperfect/source/writer/MWAWImportFilter.hxx44
-rw-r--r--writerperfect/source/writer/PagesImportFilter.cxx63
-rw-r--r--writerperfect/source/writer/PagesImportFilter.hxx43
-rw-r--r--writerperfect/source/writer/StarOfficeWriterImportFilter.cxx128
-rw-r--r--writerperfect/source/writer/StarOfficeWriterImportFilter.hxx45
-rw-r--r--writerperfect/source/writer/WordPerfectImportFilter.cxx233
-rw-r--r--writerperfect/source/writer/WordPerfectImportFilter.hxx66
-rw-r--r--writerperfect/source/writer/exp/XMLBase64ImportContext.cxx65
-rw-r--r--writerperfect/source/writer/exp/XMLBase64ImportContext.hxx48
-rw-r--r--writerperfect/source/writer/exp/XMLFootnoteImportContext.cxx126
-rw-r--r--writerperfect/source/writer/exp/XMLFootnoteImportContext.hxx46
-rw-r--r--writerperfect/source/writer/exp/XMLSectionContext.cxx44
-rw-r--r--writerperfect/source/writer/exp/XMLSectionContext.hxx39
-rw-r--r--writerperfect/source/writer/exp/XMLTextFrameContext.cxx171
-rw-r--r--writerperfect/source/writer/exp/XMLTextFrameContext.hxx44
-rw-r--r--writerperfect/source/writer/exp/XMLTextListContext.cxx33
-rw-r--r--writerperfect/source/writer/exp/XMLTextListContext.hxx35
-rw-r--r--writerperfect/source/writer/exp/XMLTextListItemContext.cxx36
-rw-r--r--writerperfect/source/writer/exp/XMLTextListItemContext.hxx35
-rw-r--r--writerperfect/source/writer/exp/txtparai.cxx630
-rw-r--r--writerperfect/source/writer/exp/txtparai.hxx65
-rw-r--r--writerperfect/source/writer/exp/txtstyli.cxx415
-rw-r--r--writerperfect/source/writer/exp/txtstyli.hxx66
-rw-r--r--writerperfect/source/writer/exp/xmlfmt.cxx295
-rw-r--r--writerperfect/source/writer/exp/xmlfmt.hxx79
-rw-r--r--writerperfect/source/writer/exp/xmlictxt.cxx56
-rw-r--r--writerperfect/source/writer/exp/xmlictxt.hxx57
-rw-r--r--writerperfect/source/writer/exp/xmlimp.cxx617
-rw-r--r--writerperfect/source/writer/exp/xmlimp.hxx161
-rw-r--r--writerperfect/source/writer/exp/xmlmetai.cxx285
-rw-r--r--writerperfect/source/writer/exp/xmlmetai.hxx89
-rw-r--r--writerperfect/source/writer/exp/xmltbli.cxx254
-rw-r--r--writerperfect/source/writer/exp/xmltbli.hxx50
-rw-r--r--writerperfect/source/writer/exp/xmltext.cxx55
-rw-r--r--writerperfect/source/writer/exp/xmltext.hxx40
-rw-r--r--writerperfect/source/writer/wpftwriter.component64
-rw-r--r--writerperfect/uiconfig/ui/exportepub.ui548
-rw-r--r--writerperfect/uiconfig/ui/wpftencodingdialog.ui96
417 files changed, 27631 insertions, 0 deletions
diff --git a/writerperfect/AllLangMoTarget_wpt.mk b/writerperfect/AllLangMoTarget_wpt.mk
new file mode 100644
index 000000000..433bb66e8
--- /dev/null
+++ b/writerperfect/AllLangMoTarget_wpt.mk
@@ -0,0 +1,13 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+$(eval $(call gb_AllLangMoTarget_AllLangMoTarget,wpt))
+
+$(eval $(call gb_AllLangMoTarget_set_polocation,wpt,writerperfect))
+
+# vim: set noet sw=4 ts=4:
diff --git a/writerperfect/CppunitTest_writerperfect_calc.mk b/writerperfect/CppunitTest_writerperfect_calc.mk
new file mode 100644
index 000000000..54647a34a
--- /dev/null
+++ b/writerperfect/CppunitTest_writerperfect_calc.mk
@@ -0,0 +1,42 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+$(eval $(call gb_CppunitTest_CppunitTest,writerperfect_calc))
+
+$(eval $(call gb_CppunitTest_use_external,writerperfect_calc,boost_headers))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,writerperfect_calc))
+
+$(eval $(call gb_CppunitTest_use_libraries,writerperfect_calc,\
+ comphelper \
+ cppu \
+ cppuhelper \
+ sal \
+ test \
+ tl \
+ ucbhelper \
+ unotest \
+ wpftqahelper \
+))
+
+$(eval $(call gb_CppunitTest_use_ure,writerperfect_calc))
+$(eval $(call gb_CppunitTest_use_vcl,writerperfect_calc))
+
+$(eval $(call gb_CppunitTest_use_rdb,writerperfect_calc,services))
+
+$(eval $(call gb_CppunitTest_use_configuration,writerperfect_calc))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,writerperfect_calc,\
+ writerperfect/qa/unit/WpftCalcFilterTest \
+))
+
+$(call gb_CppunitTest_get_target,writerperfect_calc): \
+ $(call gb_Library_get_target,ipb)
+
+# vim: set noet sw=4 ts=4:
diff --git a/writerperfect/CppunitTest_writerperfect_draw.mk b/writerperfect/CppunitTest_writerperfect_draw.mk
new file mode 100644
index 000000000..cccbafbf1
--- /dev/null
+++ b/writerperfect/CppunitTest_writerperfect_draw.mk
@@ -0,0 +1,39 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+$(eval $(call gb_CppunitTest_CppunitTest,writerperfect_draw))
+
+$(eval $(call gb_CppunitTest_use_external,writerperfect_draw,boost_headers))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,writerperfect_draw))
+
+$(eval $(call gb_CppunitTest_use_libraries,writerperfect_draw,\
+ comphelper \
+ cppu \
+ cppuhelper \
+ sal \
+ test \
+ tl \
+ ucbhelper \
+ unotest \
+ wpftqahelper \
+))
+
+$(eval $(call gb_CppunitTest_use_ure,writerperfect_draw))
+$(eval $(call gb_CppunitTest_use_vcl,writerperfect_draw))
+
+$(eval $(call gb_CppunitTest_use_rdb,writerperfect_draw,services))
+
+$(eval $(call gb_CppunitTest_use_configuration,writerperfect_draw))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,writerperfect_draw,\
+ writerperfect/qa/unit/WpftDrawFilterTest \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/writerperfect/CppunitTest_writerperfect_epubexport.mk b/writerperfect/CppunitTest_writerperfect_epubexport.mk
new file mode 100644
index 000000000..d634e59b8
--- /dev/null
+++ b/writerperfect/CppunitTest_writerperfect_epubexport.mk
@@ -0,0 +1,48 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+$(eval $(call gb_CppunitTest_CppunitTest,writerperfect_epubexport))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,writerperfect_epubexport, \
+ writerperfect/qa/unit/EPUBExportTest \
+))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,writerperfect_epubexport))
+
+$(eval $(call gb_CppunitTest_use_libraries,writerperfect_epubexport, \
+ comphelper \
+ cppu \
+ cppuhelper \
+ sal \
+ test \
+ tl \
+ unotest \
+ utl \
+ wpftwriter \
+ $(gb_UWINAPI) \
+))
+
+$(eval $(call gb_CppunitTest_use_externals,writerperfect_epubexport,\
+ epubgen \
+ libxml2 \
+ revenge \
+))
+
+$(eval $(call gb_CppunitTest_use_external,writerperfect_epubexport,boost_headers))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,writerperfect_epubexport))
+
+$(eval $(call gb_CppunitTest_use_ure,writerperfect_epubexport))
+$(eval $(call gb_CppunitTest_use_vcl,writerperfect_epubexport))
+
+$(eval $(call gb_CppunitTest_use_rdb,writerperfect_epubexport,services))
+
+$(eval $(call gb_CppunitTest_use_configuration,writerperfect_epubexport))
+
+# vim: set noet sw=4 ts=4:
diff --git a/writerperfect/CppunitTest_writerperfect_import.mk b/writerperfect/CppunitTest_writerperfect_import.mk
new file mode 100644
index 000000000..fe47a54c8
--- /dev/null
+++ b/writerperfect/CppunitTest_writerperfect_import.mk
@@ -0,0 +1,41 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+$(eval $(call gb_CppunitTest_CppunitTest,writerperfect_import))
+
+$(eval $(call gb_CppunitTest_add_defs,writerperfect_import,\
+ -DTEST_DIR=\"writerperfect/qa/unit/data/import\" \
+))
+
+$(eval $(call gb_CppunitTest_use_external,writerperfect_import,boost_headers))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,writerperfect_import))
+
+$(eval $(call gb_CppunitTest_use_libraries,writerperfect_import,\
+ comphelper \
+ cppu \
+ sal \
+ test \
+ unotest \
+ utl \
+ wpftqahelper \
+))
+
+$(eval $(call gb_CppunitTest_use_ure,writerperfect_import))
+$(eval $(call gb_CppunitTest_use_vcl,writerperfect_import))
+
+$(eval $(call gb_CppunitTest_use_rdb,writerperfect_import,services))
+
+$(eval $(call gb_CppunitTest_use_configuration,writerperfect_import))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,writerperfect_import,\
+ writerperfect/qa/unit/ImportTest \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/writerperfect/CppunitTest_writerperfect_impress.mk b/writerperfect/CppunitTest_writerperfect_impress.mk
new file mode 100644
index 000000000..c41e6e2f3
--- /dev/null
+++ b/writerperfect/CppunitTest_writerperfect_impress.mk
@@ -0,0 +1,39 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+$(eval $(call gb_CppunitTest_CppunitTest,writerperfect_impress))
+
+$(eval $(call gb_CppunitTest_use_external,writerperfect_impress,boost_headers))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,writerperfect_impress))
+
+$(eval $(call gb_CppunitTest_use_libraries,writerperfect_impress,\
+ comphelper \
+ cppu \
+ cppuhelper \
+ sal \
+ test \
+ tl \
+ ucbhelper \
+ unotest \
+ wpftqahelper \
+))
+
+$(eval $(call gb_CppunitTest_use_ure,writerperfect_impress))
+$(eval $(call gb_CppunitTest_use_vcl,writerperfect_impress))
+
+$(eval $(call gb_CppunitTest_use_rdb,writerperfect_impress,services))
+
+$(eval $(call gb_CppunitTest_use_configuration,writerperfect_impress))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,writerperfect_impress,\
+ writerperfect/qa/unit/WpftImpressFilterTest \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/writerperfect/CppunitTest_writerperfect_stream.mk b/writerperfect/CppunitTest_writerperfect_stream.mk
new file mode 100644
index 000000000..e1e637531
--- /dev/null
+++ b/writerperfect/CppunitTest_writerperfect_stream.mk
@@ -0,0 +1,59 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+$(eval $(call gb_CppunitTest_CppunitTest,writerperfect_stream))
+
+$(eval $(call gb_CppunitTest_set_include,writerperfect_stream,\
+ -I$(SRCDIR)/writerperfect/source/common \
+ -I$(SRCDIR)/writerperfect/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,writerperfect_stream))
+
+$(eval $(call gb_CppunitTest_use_ure,writerperfect_stream))
+$(eval $(call gb_CppunitTest_use_vcl,writerperfect_stream))
+
+$(eval $(call gb_CppunitTest_use_externals,writerperfect_stream,\
+ boost_headers \
+ revenge \
+))
+
+$(eval $(call gb_CppunitTest_use_libraries,writerperfect_stream,\
+ comphelper \
+ cppu \
+ cppuhelper \
+ sal \
+ sot \
+ test \
+ tl \
+ ucbhelper \
+ unotest \
+ utl \
+ writerperfect \
+))
+
+$(eval $(call gb_CppunitTest_use_configuration,writerperfect_stream))
+
+$(eval $(call gb_CppunitTest_use_components,writerperfect_stream,\
+ configmgr/source/configmgr \
+ i18npool/util/i18npool \
+ package/util/package2 \
+ ucb/source/core/ucb1 \
+ ucb/source/ucp/file/ucpfile1 \
+ unotools/util/utl \
+))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,writerperfect_stream,\
+ writerperfect/qa/unit/DirectoryStreamTest \
+ writerperfect/qa/unit/WPXSvStreamTest \
+ writerperfect/qa/unit/stream \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/writerperfect/CppunitTest_writerperfect_wpftimport.mk b/writerperfect/CppunitTest_writerperfect_wpftimport.mk
new file mode 100644
index 000000000..101908aad
--- /dev/null
+++ b/writerperfect/CppunitTest_writerperfect_wpftimport.mk
@@ -0,0 +1,56 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+$(eval $(call gb_CppunitTest_CppunitTest,writerperfect_wpftimport))
+
+$(eval $(call gb_CppunitTest_set_include,writerperfect_wpftimport,\
+ -I$(SRCDIR)/writerperfect/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_CppunitTest_use_externals,writerperfect_wpftimport,\
+ odfgen \
+ revenge \
+))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,writerperfect_wpftimport))
+
+$(eval $(call gb_CppunitTest_use_libraries,writerperfect_wpftimport,\
+ comphelper \
+ cppu \
+ cppuhelper \
+ sal \
+ test \
+ unotest \
+ utl \
+ vcl \
+ wpftqahelper \
+ writerperfect \
+))
+
+$(eval $(call gb_CppunitTest_use_external,writerperfect_wpftimport,boost_headers))
+
+$(eval $(call gb_CppunitTest_use_ure,writerperfect_wpftimport))
+$(eval $(call gb_CppunitTest_use_vcl,writerperfect_wpftimport))
+
+$(eval $(call gb_CppunitTest_use_rdbs,writerperfect_wpftimport,\
+ services \
+))
+
+$(eval $(call gb_CppunitTest_use_configuration,writerperfect_wpftimport))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,writerperfect_wpftimport,\
+ writerperfect/qa/unit/DrawingImportTest \
+ writerperfect/qa/unit/PresentationImportTest \
+ writerperfect/qa/unit/SpreadsheetImportTest \
+ writerperfect/qa/unit/TextImportTest \
+ writerperfect/qa/unit/wpftimport \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/writerperfect/CppunitTest_writerperfect_writer.mk b/writerperfect/CppunitTest_writerperfect_writer.mk
new file mode 100644
index 000000000..254d5e559
--- /dev/null
+++ b/writerperfect/CppunitTest_writerperfect_writer.mk
@@ -0,0 +1,43 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+$(eval $(call gb_CppunitTest_CppunitTest,writerperfect_writer))
+
+$(eval $(call gb_CppunitTest_use_external,writerperfect_writer,boost_headers))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,writerperfect_writer))
+
+$(eval $(call gb_CppunitTest_use_libraries,writerperfect_writer,\
+ comphelper \
+ cppu \
+ cppuhelper \
+ sal \
+ test \
+ tl \
+ ucbhelper \
+ unotest \
+ wpftqahelper \
+))
+
+$(eval $(call gb_CppunitTest_use_ure,writerperfect_writer))
+$(eval $(call gb_CppunitTest_use_vcl,writerperfect_writer))
+
+$(eval $(call gb_CppunitTest_use_rdb,writerperfect_writer,services))
+
+$(eval $(call gb_CppunitTest_use_configuration,writerperfect_writer))
+
+$(eval $(call gb_CppunitTest_use_uiconfigs,writerperfect_writer,\
+ modules/swriter \
+))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,writerperfect_writer,\
+ writerperfect/qa/unit/WpftWriterFilterTest \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/writerperfect/IwyuFilter_writerperfect.yaml b/writerperfect/IwyuFilter_writerperfect.yaml
new file mode 100644
index 000000000..86b497dff
--- /dev/null
+++ b/writerperfect/IwyuFilter_writerperfect.yaml
@@ -0,0 +1,202 @@
+---
+assumeFilename: writerperfect/source/common/WPXSvInputStream.cxx
+blacklist:
+ writerperfect/inc/DocumentHandler.hxx:
+ # Wrapper header for external library
+ - libodfgen/libodfgen.hxx
+ writerperfect/inc/DocumentHandlerForOdt.hxx:
+ # Wrapper header for external library
+ - libodfgen/libodfgen.hxx
+ writerperfect/inc/DocumentHandlerForOdg.hxx:
+ # Wrapper header for external library
+ - libodfgen/libodfgen.hxx
+ writerperfect/inc/DocumentHandlerForOds.hxx:
+ # Wrapper header for external library
+ - libodfgen/libodfgen.hxx
+ writerperfect/inc/DocumentHandlerForOdp.hxx:
+ # Wrapper header for external library
+ - libodfgen/libodfgen.hxx
+ writerperfect/inc/DirectoryStream.hxx:
+ # Wrapper header for external library
+ - librevenge-stream/librevenge-stream.h
+ writerperfect/inc/WPXSvInputStream.hxx:
+ # Wrapper header for external library
+ - librevenge-stream/librevenge-stream.h
+ writerperfect/source/calc/NumbersImportFilter.hxx:
+ # Needed for direct member access
+ - DocumentHandlerForOds.hxx
+ writerperfect/source/calc/MWAWCalcImportFilter.hxx:
+ # Needed for direct member access
+ - DocumentHandlerForOds.hxx
+ writerperfect/source/calc/StarOfficeCalcImportFilter.hxx:
+ # Needed for direct member access
+ - DocumentHandlerForOds.hxx
+ writerperfect/source/calc/MSWorksCalcImportFilter.hxx:
+ # Needed for direct member access
+ - DocumentHandlerForOds.hxx
+ writerperfect/source/draw/CDRImportFilter.hxx:
+ # Needed for direct member access
+ - DocumentHandlerForOdg.hxx
+ writerperfect/source/draw/StarOfficeDrawImportFilter.hxx:
+ # Needed for direct member access
+ - DocumentHandlerForOdg.hxx
+ writerperfect/source/draw/PageMakerImportFilter.hxx:
+ # Needed for direct member access
+ - DocumentHandlerForOdg.hxx
+ writerperfect/source/draw/ZMFImportFilter.hxx:
+ # Needed for direct member access
+ - DocumentHandlerForOdg.hxx
+ writerperfect/source/draw/CMXImportFilter.hxx:
+ # Needed for direct member access
+ - DocumentHandlerForOdg.hxx
+ writerperfect/source/draw/QXPImportFilter.hxx:
+ # Needed for direct member access
+ - DocumentHandlerForOdg.hxx
+ writerperfect/source/draw/MWAWDrawImportFilter.hxx:
+ # Needed for direct member access
+ - DocumentHandlerForOdg.hxx
+ writerperfect/source/draw/WPGImportFilter.hxx:
+ # Needed for direct member access
+ - DocumentHandlerForOdg.hxx
+ writerperfect/source/draw/MSPUBImportFilter.hxx:
+ # Needed for direct member access
+ - DocumentHandlerForOdg.hxx
+ writerperfect/source/draw/VisioImportFilter.hxx:
+ # Needed for direct member access
+ - DocumentHandlerForOdg.hxx
+ writerperfect/source/draw/FreehandImportFilter.hxx:
+ # Needed for direct member access
+ - DocumentHandlerForOdg.hxx
+ writerperfect/source/impress/MWAWPresentationImportFilter.hxx:
+ # Needed for direct member access
+ - DocumentHandlerForOdp.hxx
+ writerperfect/source/impress/StarOfficePresentationImportFilter.hxx:
+ # Needed for direct member access
+ - DocumentHandlerForOdp.hxx
+ writerperfect/source/impress/KeynoteImportFilter.hxx:
+ # Needed for direct member access
+ - DocumentHandlerForOdp.hxx
+ writerperfect/source/writer/EBookImportFilter.hxx:
+ # Needed for direct member access
+ - DocumentHandlerForOdt.hxx
+ writerperfect/source/writer/MSWorksImportFilter.hxx:
+ # Needed for direct member access
+ - DocumentHandlerForOdt.hxx
+ writerperfect/source/writer/StarOfficeWriterImportFilter.hxx:
+ # Needed for direct member access
+ - DocumentHandlerForOdt.hxx
+ writerperfect/source/writer/PagesImportFilter.hxx:
+ # Needed for direct member access
+ - DocumentHandlerForOdt.hxx
+ writerperfect/source/writer/AbiWordImportFilter.hxx:
+ # Needed for direct member access
+ - DocumentHandlerForOdt.hxx
+ writerperfect/source/writer/MWAWImportFilter.hxx:
+ # Needed for direct member access
+ - DocumentHandlerForOdt.hxx
+ writerperfect/qa/unit/WpftLoader.cxx:
+ # Actually used
+ - com/sun/star/beans/PropertyValue.hpp
+ - com/sun/star/container/XNameAccess.hpp
+ - com/sun/star/document/XFilter.hpp
+ - com/sun/star/frame/XDesktop2.hpp
+ - com/sun/star/io/XInputStream.hpp
+ - com/sun/star/uno/XComponentContext.hpp
+ # Needed for UnoType template instantiation
+ - com/sun/star/ucb/XContent.hpp
+ writerperfect/qa/unit/DrawingImportTest.cxx:
+ # Needed for direct member access
+ - DocumentHandlerForOdg.hxx
+ writerperfect/qa/unit/SpreadsheetImportTest.cxx:
+ # Needed for direct member access
+ - DocumentHandlerForOds.hxx
+ writerperfect/qa/unit/PresentationImportTest.cxx:
+ # Needed for direct member access
+ - DocumentHandlerForOdp.hxx
+ writerperfect/qa/unit/TextImportTest.cxx:
+ # Needed for direct member access
+ - DocumentHandlerForOdt.hxx
+ writerperfect/source/common/DocumentHandler.cxx:
+ # Actually used
+ - com/sun/star/xml/sax/XDocumentHandler.hpp
+ writerperfect/source/calc/NumbersImportFilter.cxx:
+ # Wrapper header for external library
+ - libetonyek/libetonyek.h
+ writerperfect/source/calc/MWAWCalcImportFilter.cxx:
+ # Wrapper header for external library
+ - libmwaw/libmwaw.hxx
+ writerperfect/source/calc/StarOfficeCalcImportFilter.cxx:
+ # Wrapper header for external library
+ - libstaroffice/libstaroffice.hxx
+ writerperfect/source/calc/MSWorksCalcImportFilter.cxx:
+ # Wrapper header for external library
+ - libwps/libwps.h
+ writerperfect/source/draw/CDRImportFilter.cxx:
+ # Wrapper header for external library
+ - libcdr/libcdr.h
+ writerperfect/source/draw/CMXImportFilter.cxx:
+ # Wrapper header for external library
+ - libcdr/libcdr.h
+ writerperfect/source/draw/FreehandImportFilter.cxx:
+ # Wrapper header for external library
+ - libfreehand/libfreehand.h
+ writerperfect/source/draw/MWAWDrawImportFilter.cxx:
+ # Wrapper header for external library
+ - libmwaw/libmwaw.hxx
+ writerperfect/source/draw/MSPUBImportFilter.cxx:
+ # Wrapper header for external library
+ - libmspub/libmspub.h
+ writerperfect/source/draw/PageMakerImportFilter.cxx:
+ # Wrapper header for external library
+ - libpagemaker/libpagemaker.h
+ writerperfect/source/draw/StarOfficeDrawImportFilter.cxx:
+ # Wrapper header for external library
+ - libstaroffice/libstaroffice.hxx
+ writerperfect/source/draw/VisioImportFilter.cxx:
+ # Wrapper header for external library
+ - libvisio/libvisio.h
+ writerperfect/source/draw/QXPImportFilter.cxx:
+ # Wrapper header for external library
+ - libqxp/libqxp.h
+ writerperfect/source/draw/WPGImportFilter.cxx:
+ # Wrapper header for external library
+ - libwpg/libwpg.h
+ writerperfect/source/draw/ZMFImportFilter.cxx:
+ # Wrapper header for external library
+ - libzmf/libzmf.h
+ writerperfect/source/impress/MWAWPresentationImportFilter.cxx:
+ # Wrapper header for external library
+ - libmwaw/libmwaw.hxx
+ writerperfect/source/impress/StarOfficePresentationImportFilter.cxx:
+ # Wrapper header for external library
+ - libstaroffice/libstaroffice.hxx
+ writerperfect/source/impress/KeynoteImportFilter.cxx:
+ # Wrapper header for external library
+ - libetonyek/libetonyek.h
+ writerperfect/source/writer/PagesImportFilter.cxx:
+ # Wrapper header for external library
+ - libetonyek/libetonyek.h
+ writerperfect/source/writer/MWAWImportFilter.cxx:
+ # Wrapper header for external library
+ - libmwaw/libmwaw.hxx
+ writerperfect/source/writer/MSWorksImportFilter.cxx:
+ # Wrapper header for external library
+ - libwps/libwps.h
+ writerperfect/source/writer/WordPerfectImportFilter.cxx:
+ # Wrapper header for external library
+ - libwpd/libwpd.h
+ - libwpg/libwpg.h
+ writerperfect/source/writer/StarOfficeWriterImportFilter.cxx:
+ # Wrapper header for external library
+ - libstaroffice/libstaroffice.hxx
+ writerperfect/source/writer/AbiWordImportFilter.cxx:
+ # Wrapper header for external library
+ - libabw/libabw.h
+ writerperfect/source/writer/EBookImportFilter.cxx:
+ # Wrapper header for external library
+ - libe-book/libe-book.h
+ writerperfect/source/writer/EPUBExportFilter.cxx:
+ # Actually used
+ - com/sun/star/uno/XComponentContext.hpp
+ writerperfect/source/writer/EPUBPackage.cxx:
+ - com/sun/star/embed/XStorage.hpp
diff --git a/writerperfect/Library_wpftcalc.mk b/writerperfect/Library_wpftcalc.mk
new file mode 100644
index 000000000..d5935efb2
--- /dev/null
+++ b/writerperfect/Library_wpftcalc.mk
@@ -0,0 +1,70 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This file incorporates work covered by the following license notice:
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed
+# with this work for additional information regarding copyright
+# ownership. The ASF licenses this file to you under the Apache
+# License, Version 2.0 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.apache.org/licenses/LICENSE-2.0 .
+#
+
+$(eval $(call gb_Library_Library,wpftcalc))
+
+$(eval $(call gb_Library_set_include,wpftcalc,\
+ -I$(SRCDIR)/writerperfect/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_Library_set_componentfile,wpftcalc,writerperfect/source/calc/wpftcalc))
+
+$(eval $(call gb_Library_use_sdk_api,wpftcalc))
+
+$(eval $(call gb_Library_use_libraries,wpftcalc,\
+ comphelper \
+ cppu \
+ cppuhelper \
+ sal \
+ sfx \
+ sot \
+ svx \
+ tl \
+ ucbhelper \
+ utl \
+ vcl \
+ writerperfect \
+ xo \
+))
+
+$(eval $(call gb_Library_use_externals,wpftcalc,\
+ boost_headers \
+ etonyek \
+ odfgen \
+ revenge \
+ mwaw \
+ staroffice \
+ wps \
+ zlib \
+ lcms2 \
+ libxml2 \
+ icu_headers \
+ icui18n \
+ icuuc \
+))
+
+$(eval $(call gb_Library_add_exception_objects,wpftcalc,\
+ writerperfect/source/calc/MSWorksCalcImportFilter \
+ writerperfect/source/calc/MWAWCalcImportFilter \
+ writerperfect/source/calc/NumbersImportFilter \
+ writerperfect/source/calc/StarOfficeCalcImportFilter \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/writerperfect/Library_wpftdraw.mk b/writerperfect/Library_wpftdraw.mk
new file mode 100644
index 000000000..54ad1beb8
--- /dev/null
+++ b/writerperfect/Library_wpftdraw.mk
@@ -0,0 +1,85 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This file incorporates work covered by the following license notice:
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed
+# with this work for additional information regarding copyright
+# ownership. The ASF licenses this file to you under the Apache
+# License, Version 2.0 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.apache.org/licenses/LICENSE-2.0 .
+#
+
+$(eval $(call gb_Library_Library,wpftdraw))
+
+$(eval $(call gb_Library_set_include,wpftdraw,\
+ -I$(SRCDIR)/writerperfect/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_Library_set_componentfile,wpftdraw,writerperfect/source/draw/wpftdraw))
+
+$(eval $(call gb_Library_use_sdk_api,wpftdraw))
+
+$(eval $(call gb_Library_use_common_precompiled_header,wpftdraw))
+
+$(eval $(call gb_Library_use_libraries,wpftdraw,\
+ comphelper \
+ cppu \
+ cppuhelper \
+ sal \
+ sot \
+ svx \
+ tl \
+ utl \
+ vcl \
+ writerperfect \
+ xo \
+))
+
+$(eval $(call gb_Library_use_externals,wpftdraw,\
+ boost_headers \
+ cdr \
+ freehand \
+ mspub \
+ mwaw \
+ odfgen \
+ zmf \
+ libpng \
+ pagemaker \
+ qxp \
+ revenge \
+ staroffice \
+ visio \
+ wpg \
+ wpd \
+ zlib \
+ lcms2 \
+ libxml2 \
+ icu_headers \
+ icui18n \
+ icuuc \
+))
+
+$(eval $(call gb_Library_add_exception_objects,wpftdraw,\
+ writerperfect/source/draw/CDRImportFilter \
+ writerperfect/source/draw/CMXImportFilter \
+ writerperfect/source/draw/FreehandImportFilter \
+ writerperfect/source/draw/MSPUBImportFilter \
+ writerperfect/source/draw/MWAWDrawImportFilter \
+ writerperfect/source/draw/PageMakerImportFilter \
+ writerperfect/source/draw/QXPImportFilter \
+ writerperfect/source/draw/StarOfficeDrawImportFilter \
+ writerperfect/source/draw/VisioImportFilter \
+ writerperfect/source/draw/WPGImportFilter \
+ writerperfect/source/draw/ZMFImportFilter \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/writerperfect/Library_wpftimpress.mk b/writerperfect/Library_wpftimpress.mk
new file mode 100644
index 000000000..62b5482b6
--- /dev/null
+++ b/writerperfect/Library_wpftimpress.mk
@@ -0,0 +1,63 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This file incorporates work covered by the following license notice:
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed
+# with this work for additional information regarding copyright
+# ownership. The ASF licenses this file to you under the Apache
+# License, Version 2.0 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.apache.org/licenses/LICENSE-2.0 .
+#
+
+$(eval $(call gb_Library_Library,wpftimpress))
+
+$(eval $(call gb_Library_set_include,wpftimpress,\
+ -I$(SRCDIR)/writerperfect/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_Library_set_componentfile,wpftimpress,writerperfect/source/impress/wpftimpress))
+
+$(eval $(call gb_Library_use_sdk_api,wpftimpress))
+
+$(eval $(call gb_Library_use_libraries,wpftimpress,\
+ comphelper \
+ cppu \
+ cppuhelper \
+ sal \
+ sot \
+ svx \
+ tl \
+ ucbhelper \
+ utl \
+ vcl \
+ writerperfect \
+ xo \
+))
+
+$(eval $(call gb_Library_use_externals,wpftimpress,\
+ boost_headers \
+ etonyek \
+ mwaw \
+ odfgen \
+ staroffice \
+ revenge \
+ zlib \
+ libxml2 \
+))
+
+$(eval $(call gb_Library_add_exception_objects,wpftimpress,\
+ writerperfect/source/impress/KeynoteImportFilter \
+ writerperfect/source/impress/MWAWPresentationImportFilter \
+ writerperfect/source/impress/StarOfficePresentationImportFilter \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/writerperfect/Library_wpftqahelper.mk b/writerperfect/Library_wpftqahelper.mk
new file mode 100644
index 000000000..d6750e050
--- /dev/null
+++ b/writerperfect/Library_wpftqahelper.mk
@@ -0,0 +1,43 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+$(eval $(call gb_Library_Library,wpftqahelper))
+
+$(eval $(call gb_Library_set_include,wpftqahelper,\
+ -I$(SRCDIR)/writerperfect/qa/unit \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_Library_add_defs,wpftqahelper,\
+ -DWPFTQAHELPER_DLLIMPLEMENTATION \
+))
+
+$(eval $(call gb_Library_use_externals,wpftqahelper,\
+ boost_headers \
+ cppunit \
+))
+
+$(eval $(call gb_Library_use_sdk_api,wpftqahelper))
+
+$(eval $(call gb_Library_use_libraries,wpftqahelper,\
+ cppu \
+ sal \
+ test \
+ tl \
+ ucbhelper \
+ unotest \
+))
+
+$(eval $(call gb_Library_add_exception_objects,wpftqahelper,\
+ writerperfect/qa/unit/WpftFilterFixture \
+ writerperfect/qa/unit/WpftFilterTestBase \
+ writerperfect/qa/unit/WpftLoader \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/writerperfect/Library_wpftwriter.mk b/writerperfect/Library_wpftwriter.mk
new file mode 100644
index 000000000..8993cca31
--- /dev/null
+++ b/writerperfect/Library_wpftwriter.mk
@@ -0,0 +1,113 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This file incorporates work covered by the following license notice:
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed
+# with this work for additional information regarding copyright
+# ownership. The ASF licenses this file to you under the Apache
+# License, Version 2.0 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.apache.org/licenses/LICENSE-2.0 .
+#
+
+$(eval $(call gb_Library_Library,wpftwriter))
+
+$(eval $(call gb_Library_set_include,wpftwriter,\
+ -I$(SRCDIR)/writerperfect/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_Library_set_componentfile,wpftwriter,writerperfect/source/writer/wpftwriter))
+
+$(eval $(call gb_Library_use_sdk_api,wpftwriter))
+
+$(eval $(call gb_Library_use_common_precompiled_header,wpftwriter))
+
+$(eval $(call gb_Library_use_libraries,wpftwriter,\
+ comphelper \
+ cppu \
+ cppuhelper \
+ i18nlangtag \
+ vcl \
+ sal \
+ sax \
+ sfx \
+ sot \
+ svt \
+ svx \
+ tl \
+ ucbhelper \
+ utl \
+ vcl \
+ writerperfect \
+ xo \
+))
+
+$(eval $(call gb_Library_use_externals,wpftwriter,\
+ abw \
+ boost_headers \
+ ebook \
+ epubgen \
+ etonyek \
+ icu_headers \
+ icui18n \
+ icuuc \
+ liblangtag \
+ libxml2 \
+ mwaw \
+ odfgen \
+ revenge \
+ staroffice \
+ wpd \
+ wpg \
+ wps \
+ zlib \
+))
+
+$(eval $(call gb_Library_add_exception_objects,wpftwriter,\
+ writerperfect/source/writer/AbiWordImportFilter \
+ writerperfect/source/writer/EBookImportFilter \
+ writerperfect/source/writer/EPUBExportDialog \
+ writerperfect/source/writer/EPUBExportFilter \
+ writerperfect/source/writer/EPUBExportUIComponent \
+ writerperfect/source/writer/EPUBPackage \
+ writerperfect/source/writer/MSWorksImportFilter \
+ writerperfect/source/writer/MWAWImportFilter \
+ writerperfect/source/writer/PagesImportFilter \
+ writerperfect/source/writer/StarOfficeWriterImportFilter \
+ writerperfect/source/writer/WordPerfectImportFilter \
+ writerperfect/source/writer/exp/XMLBase64ImportContext \
+ writerperfect/source/writer/exp/XMLFootnoteImportContext \
+ writerperfect/source/writer/exp/XMLSectionContext \
+ writerperfect/source/writer/exp/XMLTextFrameContext \
+ writerperfect/source/writer/exp/XMLTextListContext \
+ writerperfect/source/writer/exp/XMLTextListItemContext \
+ writerperfect/source/writer/exp/txtparai \
+ writerperfect/source/writer/exp/txtstyli \
+ writerperfect/source/writer/exp/xmlfmt \
+ writerperfect/source/writer/exp/xmlictxt \
+ writerperfect/source/writer/exp/xmlimp \
+ writerperfect/source/writer/exp/xmlmetai \
+ writerperfect/source/writer/exp/xmltbli \
+ writerperfect/source/writer/exp/xmltext \
+))
+
+# On Windows, libepubgen-0.1.lib(EPUBGenerator.obj) references BCryptCloseAlgorithmProvider,
+# BCryptGenRandom, and BCryptOpenAlgorithmProvider via
+# workdir/UnpackedTarball/boost/boost/winapi/bcrypt.hpp:
+ifeq ($(OS),WNT)
+ifeq ($(SYSTEM_EPUBGEN)$(SYSTEM_BOOST),)
+$(eval $(call gb_Library_add_libs,wpftwriter, \
+ Bcrypt.lib \
+))
+endif
+endif
+
+# vim: set noet sw=4 ts=4:
diff --git a/writerperfect/Library_writerperfect.mk b/writerperfect/Library_writerperfect.mk
new file mode 100644
index 000000000..64df2cba9
--- /dev/null
+++ b/writerperfect/Library_writerperfect.mk
@@ -0,0 +1,60 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This file incorporates work covered by the following license notice:
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed
+# with this work for additional information regarding copyright
+# ownership. The ASF licenses this file to you under the Apache
+# License, Version 2.0 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.apache.org/licenses/LICENSE-2.0 .
+#
+
+$(eval $(call gb_Library_Library,writerperfect))
+
+$(eval $(call gb_Library_add_defs,writerperfect,\
+ -DWRITERPERFECT_DLLIMPLEMENTATION \
+))
+
+$(eval $(call gb_Library_set_include,writerperfect, \
+ -I$(SRCDIR)/writerperfect/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_Library_use_externals,writerperfect,\
+ boost_headers \
+ odfgen \
+ revenge \
+))
+
+$(eval $(call gb_Library_use_sdk_api,writerperfect))
+
+$(eval $(call gb_Library_use_libraries,writerperfect,\
+ comphelper \
+ cppu \
+ cppuhelper \
+ sal \
+ sot \
+ svx \
+ tl \
+ ucbhelper \
+ utl \
+ vcl \
+ xo \
+))
+
+$(eval $(call gb_Library_add_exception_objects,writerperfect,\
+ writerperfect/source/common/DirectoryStream \
+ writerperfect/source/common/DocumentHandler \
+ writerperfect/source/common/WPFTEncodingDialog \
+ writerperfect/source/common/WPXSvInputStream \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/writerperfect/Makefile b/writerperfect/Makefile
new file mode 100644
index 000000000..0997e6284
--- /dev/null
+++ b/writerperfect/Makefile
@@ -0,0 +1,14 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+module_directory:=$(dir $(realpath $(firstword $(MAKEFILE_LIST))))
+
+include $(module_directory)/../solenv/gbuild/partial_build.mk
+
+# vim: set noet sw=4 ts=4:
diff --git a/writerperfect/Module_writerperfect.mk b/writerperfect/Module_writerperfect.mk
new file mode 100644
index 000000000..01f8a0dc5
--- /dev/null
+++ b/writerperfect/Module_writerperfect.mk
@@ -0,0 +1,54 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This file incorporates work covered by the following license notice:
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed
+# with this work for additional information regarding copyright
+# ownership. The ASF licenses this file to you under the Apache
+# License, Version 2.0 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.apache.org/licenses/LICENSE-2.0 .
+#
+
+$(eval $(call gb_Module_Module,writerperfect))
+
+$(eval $(call gb_Module_add_targets,writerperfect,\
+ Library_wpftcalc \
+ Library_wpftdraw \
+ Library_wpftimpress \
+ Library_wpftwriter \
+ Library_writerperfect \
+ UIConfig_writerperfect \
+))
+
+$(eval $(call gb_Module_add_l10n_targets,writerperfect,\
+ AllLangMoTarget_wpt \
+))
+
+$(eval $(call gb_Module_add_check_targets,writerperfect,\
+ CppunitTest_writerperfect_stream \
+ CppunitTest_writerperfect_wpftimport \
+))
+
+$(eval $(call gb_Module_add_slowcheck_targets,writerperfect,\
+ CppunitTest_writerperfect_calc \
+ CppunitTest_writerperfect_draw \
+ $(if $(SYSTEM_EPUBGEN),,CppunitTest_writerperfect_epubexport) \
+ CppunitTest_writerperfect_import \
+ CppunitTest_writerperfect_impress \
+ CppunitTest_writerperfect_writer \
+ Library_wpftqahelper \
+))
+
+$(eval $(call gb_Module_add_uicheck_targets,writerperfect,\
+ UITest_writerperfect_epubexport \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/writerperfect/README b/writerperfect/README
new file mode 100644
index 000000000..9edcb4011
--- /dev/null
+++ b/writerperfect/README
@@ -0,0 +1,6 @@
+WordPerfect and other filters, wrappers for a set of similar libraries
+
+This collection of filters is here in this folder in addition to the
+WordPerfect filter that gave the module its (humorous) name "writerperfect"
+because the libraries they use all have the same "style" of API and are
+developed, at least partially, by the same person or group of persons.
diff --git a/writerperfect/UIConfig_writerperfect.mk b/writerperfect/UIConfig_writerperfect.mk
new file mode 100644
index 000000000..8599babf7
--- /dev/null
+++ b/writerperfect/UIConfig_writerperfect.mk
@@ -0,0 +1,27 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This file incorporates work covered by the following license notice:
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed
+# with this work for additional information regarding copyright
+# ownership. The ASF licenses this file to you under the Apache
+# License, Version 2.0 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.apache.org/licenses/LICENSE-2.0 .
+#
+
+$(eval $(call gb_UIConfig_UIConfig,writerperfect))
+
+$(eval $(call gb_UIConfig_add_uifiles,writerperfect,\
+ writerperfect/uiconfig/ui/wpftencodingdialog \
+ writerperfect/uiconfig/ui/exportepub \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/writerperfect/UITest_writerperfect_epubexport.mk b/writerperfect/UITest_writerperfect_epubexport.mk
new file mode 100644
index 000000000..ebec0bf76
--- /dev/null
+++ b/writerperfect/UITest_writerperfect_epubexport.mk
@@ -0,0 +1,16 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+$(eval $(call gb_UITest_UITest,writerperfect_epubexport))
+
+$(eval $(call gb_UITest_add_modules,writerperfect_epubexport,$(SRCDIR)/writerperfect/qa/uitest,\
+ epubexport/ \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/writerperfect/inc/DirectoryStream.hxx b/writerperfect/inc/DirectoryStream.hxx
new file mode 100644
index 000000000..3da07bc15
--- /dev/null
+++ b/writerperfect/inc/DirectoryStream.hxx
@@ -0,0 +1,67 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_DIRECTORYSTREAM_HXX
+#define INCLUDED_WRITERPERFECT_DIRECTORYSTREAM_HXX
+
+#include <librevenge-stream/librevenge-stream.h>
+#include <com/sun/star/uno/Reference.h>
+#include "writerperfectdllapi.h"
+#include <memory>
+
+namespace com
+{
+namespace sun
+{
+namespace star
+{
+namespace ucb
+{
+class XContent;
+}
+}
+}
+}
+
+namespace writerperfect
+{
+class WRITERPERFECT_DLLPUBLIC DirectoryStream final : public librevenge::RVNGInputStream
+{
+ struct Impl;
+
+public:
+ explicit DirectoryStream(const css::uno::Reference<css::ucb::XContent>& xContent);
+ virtual ~DirectoryStream() override;
+
+ static bool isDirectory(const css::uno::Reference<css::ucb::XContent>& xContent);
+ static std::unique_ptr<DirectoryStream>
+ createForParent(const css::uno::Reference<css::ucb::XContent>& xContent);
+
+ css::uno::Reference<css::ucb::XContent> getContent() const;
+
+ virtual bool isStructured() override;
+ virtual unsigned subStreamCount() override;
+ virtual const char* subStreamName(unsigned id) override;
+ virtual bool existsSubStream(const char* name) override;
+ virtual librevenge::RVNGInputStream* getSubStreamByName(const char* name) override;
+ virtual librevenge::RVNGInputStream* getSubStreamById(unsigned id) override;
+
+ virtual const unsigned char* read(unsigned long numBytes, unsigned long& numBytesRead) override;
+ virtual int seek(long offset, librevenge::RVNG_SEEK_TYPE seekType) override;
+ virtual long tell() override;
+ virtual bool isEnd() override;
+
+private:
+ std::unique_ptr<Impl> m_pImpl;
+};
+}
+
+#endif // INCLUDED_WRITERPERFECT_DIRECTORYSTREAM_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/inc/DocumentHandler.hxx b/writerperfect/inc/DocumentHandler.hxx
new file mode 100644
index 000000000..6f8734008
--- /dev/null
+++ b/writerperfect/inc/DocumentHandler.hxx
@@ -0,0 +1,65 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_DOCUMENTHANDLER_HXX
+#define INCLUDED_WRITERPERFECT_DOCUMENTHANDLER_HXX
+
+#include <libodfgen/libodfgen.hxx>
+
+#include <com/sun/star/uno/Reference.h>
+
+#include "writerperfectdllapi.h"
+
+namespace com
+{
+namespace sun
+{
+namespace star
+{
+namespace xml
+{
+namespace sax
+{
+class XDocumentHandler;
+}
+}
+}
+}
+}
+
+namespace writerperfect
+{
+class WRITERPERFECT_DLLPUBLIC DocumentHandler final : public OdfDocumentHandler
+{
+public:
+ DocumentHandler(css::uno::Reference<css::xml::sax::XDocumentHandler> const& xHandler);
+ void startDocument() override;
+ void endDocument() override;
+ void startElement(const char* psName, const librevenge::RVNGPropertyList& xPropList) override;
+ void endElement(const char* psName) override;
+ void characters(const librevenge::RVNGString& sCharacters) override;
+
+private:
+ css::uno::Reference<css::xml::sax::XDocumentHandler> mxHandler;
+};
+}
+
+#endif // INCLUDED_WRITERPERFECT_DOCUMENTHANDLER_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/inc/DocumentHandlerFor.hxx b/writerperfect/inc/DocumentHandlerFor.hxx
new file mode 100644
index 000000000..d90039e2c
--- /dev/null
+++ b/writerperfect/inc/DocumentHandlerFor.hxx
@@ -0,0 +1,25 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_INC_WRITERPERFECT_DOCUMENTHANDLERFOR_HXX
+#define INCLUDED_WRITERPERFECT_INC_WRITERPERFECT_DOCUMENTHANDLERFOR_HXX
+
+namespace writerperfect
+{
+/** Definition of XML import service used with a Generator.
+
+ This template must be specialized for every libodfgen generator.
+ */
+template <class Generator> struct DocumentHandlerFor
+{
+ // static OUString name();
+};
+}
+
+#endif // INCLUDED_WRITERPERFECT_INC_WRITERPERFECT_DOCUMENTHANDLERFOR_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/inc/DocumentHandlerForOdg.hxx b/writerperfect/inc/DocumentHandlerForOdg.hxx
new file mode 100644
index 000000000..e7017513d
--- /dev/null
+++ b/writerperfect/inc/DocumentHandlerForOdg.hxx
@@ -0,0 +1,27 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_INC_DOCUMENTHANDLERFORODG_HXX
+#define INCLUDED_WRITERPERFECT_INC_DOCUMENTHANDLERFORODG_HXX
+
+#include <libodfgen/libodfgen.hxx>
+
+#include "DocumentHandlerFor.hxx"
+
+#include <rtl/ustring.hxx>
+
+namespace writerperfect
+{
+template <> struct DocumentHandlerFor<OdgGenerator>
+{
+ static OUString name() { return "com.sun.star.comp.Draw.XMLOasisImporter"; }
+};
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/inc/DocumentHandlerForOdp.hxx b/writerperfect/inc/DocumentHandlerForOdp.hxx
new file mode 100644
index 000000000..6ee5a83e7
--- /dev/null
+++ b/writerperfect/inc/DocumentHandlerForOdp.hxx
@@ -0,0 +1,27 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_INC_DOCUMENTHANDLERFORODP_HXX
+#define INCLUDED_WRITERPERFECT_INC_DOCUMENTHANDLERFORODP_HXX
+
+#include <libodfgen/libodfgen.hxx>
+
+#include "DocumentHandlerFor.hxx"
+
+#include <rtl/ustring.hxx>
+
+namespace writerperfect
+{
+template <> struct DocumentHandlerFor<OdpGenerator>
+{
+ static OUString name() { return "com.sun.star.comp.Impress.XMLOasisImporter"; }
+};
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/inc/DocumentHandlerForOds.hxx b/writerperfect/inc/DocumentHandlerForOds.hxx
new file mode 100644
index 000000000..48b78fa9a
--- /dev/null
+++ b/writerperfect/inc/DocumentHandlerForOds.hxx
@@ -0,0 +1,27 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_INC_DOCUMENTHANDLERFORODS_HXX
+#define INCLUDED_WRITERPERFECT_INC_DOCUMENTHANDLERFORODS_HXX
+
+#include <libodfgen/libodfgen.hxx>
+
+#include "DocumentHandlerFor.hxx"
+
+#include <rtl/ustring.hxx>
+
+namespace writerperfect
+{
+template <> struct DocumentHandlerFor<OdsGenerator>
+{
+ static OUString name() { return "com.sun.star.comp.Calc.XMLOasisImporter"; }
+};
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/inc/DocumentHandlerForOdt.hxx b/writerperfect/inc/DocumentHandlerForOdt.hxx
new file mode 100644
index 000000000..55acf1fc7
--- /dev/null
+++ b/writerperfect/inc/DocumentHandlerForOdt.hxx
@@ -0,0 +1,27 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_INC_DOCUMENTHANDLERFORODT_HXX
+#define INCLUDED_WRITERPERFECT_INC_DOCUMENTHANDLERFORODT_HXX
+
+#include <libodfgen/libodfgen.hxx>
+
+#include "DocumentHandlerFor.hxx"
+
+#include <rtl/ustring.hxx>
+
+namespace writerperfect
+{
+template <> struct DocumentHandlerFor<OdtGenerator>
+{
+ static OUString name() { return "com.sun.star.comp.Writer.XMLOasisImporter"; }
+};
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/inc/ImportFilter.hxx b/writerperfect/inc/ImportFilter.hxx
new file mode 100644
index 000000000..4328b9021
--- /dev/null
+++ b/writerperfect/inc/ImportFilter.hxx
@@ -0,0 +1,180 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_INC_WRITERPERFECT_IMPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_INC_WRITERPERFECT_IMPORTFILTER_HXX
+
+#include <com/sun/star/awt/XWindow.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/document/XExtendedFilterDetection.hpp>
+#include <com/sun/star/document/XFilter.hpp>
+#include <com/sun/star/document/XImporter.hpp>
+#include <com/sun/star/io/XInputStream.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/uno/Reference.h>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/xml/sax/XDocumentHandler.hpp>
+
+#include <osl/diagnose.h>
+#include <cppuhelper/implbase.hxx>
+
+#include <unotools/mediadescriptor.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/weld.hxx>
+
+#include "DocumentHandler.hxx"
+#include "WPXSvInputStream.hxx"
+
+#include "DocumentHandlerFor.hxx"
+
+namespace writerperfect
+{
+namespace detail
+{
+template <class Generator>
+class ImportFilterImpl
+ : public cppu::WeakImplHelper<css::document::XFilter, css::document::XImporter,
+ css::document::XExtendedFilterDetection,
+ css::lang::XInitialization>
+{
+public:
+ ImportFilterImpl(const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : mxContext(rxContext)
+ {
+ }
+
+ const css::uno::Reference<css::uno::XComponentContext>& getXContext() const
+ {
+ return mxContext;
+ }
+
+ // XFilter
+ virtual sal_Bool SAL_CALL
+ filter(const css::uno::Sequence<css::beans::PropertyValue>& rDescriptor) override
+ {
+ utl::MediaDescriptor aDescriptor(rDescriptor);
+ css::uno::Reference<css::io::XInputStream> xInputStream;
+ aDescriptor[utl::MediaDescriptor::PROP_INPUTSTREAM()] >>= xInputStream;
+ if (!xInputStream.is())
+ {
+ OSL_ASSERT(false);
+ return false;
+ }
+
+ css::uno::Reference<css::awt::XWindow> xDialogParent;
+ aDescriptor["ParentWindow"] >>= xDialogParent;
+
+ // An XML import service: what we push sax messages to...
+ css::uno::Reference<css::xml::sax::XDocumentHandler> xInternalHandler(
+ mxContext->getServiceManager()->createInstanceWithContext(
+ DocumentHandlerFor<Generator>::name(), mxContext),
+ css::uno::UNO_QUERY_THROW);
+
+ // The XImporter sets up an empty target document for XDocumentHandler to write to...
+ css::uno::Reference<css::document::XImporter> xImporter(xInternalHandler,
+ css::uno::UNO_QUERY);
+ xImporter->setTargetDocument(mxDoc);
+
+ // OO Graphics Handler: abstract class to handle document SAX messages, concrete implementation here
+ // writes to in-memory target doc
+ DocumentHandler aHandler(xInternalHandler);
+
+ WPXSvInputStream input(xInputStream);
+
+ Generator exporter;
+ exporter.addDocumentHandler(&aHandler, ODF_FLAT_XML);
+
+ doRegisterHandlers(exporter);
+
+ return doImportDocument(Application::GetFrameWeld(xDialogParent), input, exporter,
+ aDescriptor);
+ }
+
+ virtual void SAL_CALL cancel() override {}
+
+ // XImporter
+ const css::uno::Reference<css::lang::XComponent>& getTargetDocument() const { return mxDoc; }
+ virtual void SAL_CALL
+ setTargetDocument(const css::uno::Reference<css::lang::XComponent>& xDoc) override
+ {
+ mxDoc = xDoc;
+ }
+
+ //XExtendedFilterDetection
+ virtual OUString SAL_CALL
+ detect(css::uno::Sequence<css::beans::PropertyValue>& Descriptor) override
+ {
+ OUString sTypeName;
+ sal_Int32 nLength = Descriptor.getLength();
+ sal_Int32 location = nLength;
+ const css::beans::PropertyValue* pValue = Descriptor.getConstArray();
+ css::uno::Reference<css::io::XInputStream> xInputStream;
+ for (sal_Int32 i = 0; i < nLength; i++)
+ {
+ if (pValue[i].Name == "TypeName")
+ location = i;
+ else if (pValue[i].Name == "InputStream")
+ pValue[i].Value >>= xInputStream;
+ }
+
+ if (!xInputStream.is())
+ return OUString();
+
+ WPXSvInputStream input(xInputStream);
+
+ if (doDetectFormat(input, sTypeName))
+ {
+ assert(!sTypeName.isEmpty());
+
+ if (location == nLength)
+ {
+ Descriptor.realloc(nLength + 1);
+ Descriptor[location].Name = "TypeName";
+ }
+
+ Descriptor[location].Value <<= sTypeName;
+ }
+
+ return sTypeName;
+ }
+
+ // XInitialization
+ virtual void SAL_CALL
+ initialize(const css::uno::Sequence<css::uno::Any>& /*aArguments*/) override
+ {
+ }
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) = 0;
+ virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
+ Generator& rGenerator, utl::MediaDescriptor& rDescriptor)
+ = 0;
+ virtual void doRegisterHandlers(Generator&){};
+
+ css::uno::Reference<css::uno::XComponentContext> mxContext;
+ css::uno::Reference<css::lang::XComponent> mxDoc;
+};
+}
+
+/** A base class for import filters.
+ */
+template <class Generator>
+struct ImportFilter : public cppu::ImplInheritanceHelper<detail::ImportFilterImpl<Generator>,
+ css::lang::XServiceInfo>
+{
+ ImportFilter(const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : cppu::ImplInheritanceHelper<detail::ImportFilterImpl<Generator>, css::lang::XServiceInfo>(
+ rxContext)
+ {
+ }
+};
+}
+
+#endif // INCLUDED_WRITERPERFECT_INC_WRITERPERFECT_IMPORTFILTER_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/inc/WPFTEncodingDialog.hxx b/writerperfect/inc/WPFTEncodingDialog.hxx
new file mode 100644
index 000000000..433141ebe
--- /dev/null
+++ b/writerperfect/inc/WPFTEncodingDialog.hxx
@@ -0,0 +1,48 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* MSWorksImportFilter: Sets up the filter, and calls DocumentCollector
+ * to do the actual filtering
+ *
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_WPFTENCODINGDIALOG_HXX
+#define INCLUDED_WRITERPERFECT_WPFTENCODINGDIALOG_HXX
+
+#include <vcl/weld.hxx>
+
+#include "writerperfectdllapi.h"
+
+namespace writerperfect
+{
+class WRITERPERFECT_DLLPUBLIC WPFTEncodingDialog final : public weld::GenericDialogController
+{
+public:
+ WPFTEncodingDialog(weld::Window* pParent, const OUString& title, const OUString& defEncoding);
+
+ virtual ~WPFTEncodingDialog() override;
+
+ OUString GetEncoding() const;
+ bool hasUserCalledCancel() const { return m_userHasCancelled; }
+
+private:
+ bool m_userHasCancelled;
+
+ std::unique_ptr<weld::ComboBox> m_xLbCharset;
+ std::unique_ptr<weld::Button> m_xBtnOk;
+ std::unique_ptr<weld::Button> m_xBtnCancel;
+
+private:
+ DECL_LINK(CancelHdl, weld::Button&, void);
+
+ WPFTEncodingDialog(WPFTEncodingDialog const&) = delete;
+ WPFTEncodingDialog& operator=(WPFTEncodingDialog const&) = delete;
+};
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/inc/WPFTResMgr.hxx b/writerperfect/inc/WPFTResMgr.hxx
new file mode 100644
index 000000000..0cff3e446
--- /dev/null
+++ b/writerperfect/inc/WPFTResMgr.hxx
@@ -0,0 +1,12 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+
+#ifndef INCLUDED_WRITERPERFECT_INC_WPFTRESMGR_HXX
+#define INCLUDED_WRITERPERFECT_INC_WPFTRESMGR_HXX
+
+#include <unotools/resmgr.hxx>
+
+inline OUString WpResId(const char* pId) { return Translate::get(pId, Translate::Create("wpt")); }
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/inc/WPXSvInputStream.hxx b/writerperfect/inc/WPXSvInputStream.hxx
new file mode 100644
index 000000000..359086848
--- /dev/null
+++ b/writerperfect/inc/WPXSvInputStream.hxx
@@ -0,0 +1,62 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_WPXSVINPUTSTREAM_HXX
+#define INCLUDED_WRITERPERFECT_WPXSVINPUTSTREAM_HXX
+
+#include <librevenge-stream/librevenge-stream.h>
+#include <com/sun/star/uno/Reference.h>
+#include "writerperfectdllapi.h"
+#include <memory>
+
+namespace com
+{
+namespace sun
+{
+namespace star
+{
+namespace io
+{
+class XInputStream;
+class XSeekable;
+}
+}
+}
+}
+
+namespace writerperfect
+{
+class WPXSvInputStreamImpl;
+
+class WRITERPERFECT_DLLPUBLIC WPXSvInputStream final : public librevenge::RVNGInputStream
+{
+public:
+ WPXSvInputStream(css::uno::Reference<css::io::XInputStream> const& xStream);
+ virtual ~WPXSvInputStream() override;
+
+ virtual bool isStructured() override;
+ virtual unsigned subStreamCount() override;
+ virtual const char* subStreamName(unsigned id) override;
+ virtual bool existsSubStream(const char* name) override;
+ virtual librevenge::RVNGInputStream* getSubStreamByName(const char* name) override;
+ virtual librevenge::RVNGInputStream* getSubStreamById(unsigned id) override;
+
+ virtual const unsigned char* read(unsigned long numBytes, unsigned long& numBytesRead) override;
+ virtual int seek(long offset, librevenge::RVNG_SEEK_TYPE seekType) override;
+ virtual long tell() override;
+ virtual bool isEnd() override;
+
+private:
+ std::unique_ptr<WPXSvInputStreamImpl> mpImpl;
+};
+}
+
+#endif // INCLUDED_WRITERPERFECT_WPXSVINPUTSTREAM_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/inc/strings.hrc b/writerperfect/inc/strings.hrc
new file mode 100644
index 000000000..a85c1fb71
--- /dev/null
+++ b/writerperfect/inc/strings.hrc
@@ -0,0 +1,26 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_INC_STRINGS_HRC
+#define INCLUDED_WRITERPERFECT_INC_STRINGS_HRC
+
+#define NC_(Context, String) reinterpret_cast<char const *>(Context "\004" u8##String)
+
+#define STR_ENCODING_DIALOG_TITLE NC_("STR_ENCODING_DIALOG_TITLE", "Import file")
+#define STR_ENCODING_DIALOG_TITLE_MSMULTIPLAN NC_("STR_ENCODING_DIALOG_TITLE_MSMULTIPLAN", "Import MS Multiplan for DOS file")
+#define STR_ENCODING_DIALOG_TITLE_MSWORKS NC_("STR_ENCODING_DIALOG_TITLE_MSWORKS", "Import MS Works file")
+#define STR_ENCODING_DIALOG_TITLE_MSWRITE NC_("STR_ENCODING_DIALOG_TITLE_MSWRITE", "Import MS Write file")
+#define STR_ENCODING_DIALOG_TITLE_DOSWORD NC_("STR_ENCODING_DIALOG_TITLE_DOSWORD", "Import MS Word for DOS file")
+#define STR_ENCODING_DIALOG_TITLE_LOTUS NC_("STR_ENCODING_DIALOG_TITLE_LOTUS", "Import Lotus file")
+#define STR_ENCODING_DIALOG_TITLE_SYMPHONY NC_("STR_ENCODING_DIALOG_TITLE_SYMPHONY", "Import Symphony file")
+#define STR_ENCODING_DIALOG_TITLE_QUATTROPRO NC_("STR_ENCODING_DIALOG_TITLE_QUATTROPRO", "Import Quattro Pro file")
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/inc/writerperfectdllapi.h b/writerperfect/inc/writerperfectdllapi.h
new file mode 100644
index 000000000..d5495717e
--- /dev/null
+++ b/writerperfect/inc/writerperfectdllapi.h
@@ -0,0 +1,23 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_WRITERPERFECTDLLAPI_H
+#define INCLUDED_WRITERPERFECT_WRITERPERFECTDLLAPI_H
+
+#if defined WRITERPERFECT_DLLIMPLEMENTATION
+
+#define WRITERPERFECT_DLLPUBLIC SAL_DLLPUBLIC_EXPORT
+#else
+#define WRITERPERFECT_DLLPUBLIC SAL_DLLPUBLIC_IMPORT
+#endif
+#define WRITERPERFECT_DLLPRIVATE SAL_DLLPRIVATE
+
+#endif /* INCLUDED_WRITERPERFECT_WRITERPERFECTDLLAPI_H */
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/qa/uitest/epubexport/epubexport.py b/writerperfect/qa/uitest/epubexport/epubexport.py
new file mode 100644
index 000000000..b8e7d3f52
--- /dev/null
+++ b/writerperfect/qa/uitest/epubexport/epubexport.py
@@ -0,0 +1,142 @@
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+from com.sun.star.beans import PropertyValue
+from libreoffice.uno.propertyvalue import mkPropertyValues
+from uitest.framework import UITestCase
+from uitest.uihelper.common import get_state_as_dict
+import uno
+
+
+# Test for EPUBExportDialog and EPUBExportUIComponent.
+class EPUBExportTest(UITestCase):
+
+ def testUIComponent(self):
+ def handleDialog(dialog):
+ # Select the second entry to request EPUB2, not EPUB3.
+ dialog.getChild("versionlb").executeAction("SELECT", mkPropertyValues({"POS": "1"}))
+ dialog.getChild("ok").executeAction("CLICK", tuple())
+
+ uiComponent = self.ui_test._xContext.ServiceManager.createInstanceWithContext("com.sun.star.comp.Writer.EPUBExportUIComponent", self.ui_test._xContext)
+
+ # Make sure we get what we asked for.
+ self.assertEqual("com.sun.star.comp.Writer.EPUBExportUIComponent", uiComponent.getImplementationName())
+ self.assertEqual(True, uiComponent.supportsService("com.sun.star.ui.dialogs.FilterOptionsDialog"))
+ # Just make sure this doesn't fail.
+ uiComponent.setTitle(str())
+
+ self.ui_test.execute_blocking_action(action=uiComponent.execute, dialog_handler=handleDialog)
+ propertyValues = uiComponent.getPropertyValues()
+ filterData = [i.Value for i in propertyValues if i.Name == "FilterData"][0]
+ epubVersion = [i.Value for i in filterData if i.Name == "EPUBVersion"][0]
+ # This was 30, EPUBExportDialog::VersionSelectHdl() did not set the version.
+ self.assertEqual(20, epubVersion)
+
+ def testCustomProperties(self):
+ uiComponent = self.ui_test._xContext.ServiceManager.createInstanceWithContext("com.sun.star.comp.Writer.EPUBExportUIComponent", self.ui_test._xContext)
+
+ # Make sure that by default the version is not altered.
+ propertyValues = uiComponent.getPropertyValues()
+ filterData = [i.Value for i in propertyValues if i.Name == "FilterData"][0]
+ self.assertEqual(0, len([i.Value for i in filterData if i.Name == "EPUBVersion"]))
+
+ # But if we set it explicitly, then it's retained, even without interacting with the UI.
+ filterData = (PropertyValue(Name="EPUBVersion", Value=30),)
+ propertyValues = (PropertyValue(Name="FilterData", Value=uno.Any("[]com.sun.star.beans.PropertyValue", filterData)),)
+ uiComponent.setPropertyValues(propertyValues)
+ propertyValues = uiComponent.getPropertyValues()
+ filterData = [i.Value for i in propertyValues if i.Name == "FilterData"][0]
+ epubVersion = [i.Value for i in filterData if i.Name == "EPUBVersion"][0]
+ self.assertEqual(30, epubVersion)
+
+ def testDialogVersionInput(self):
+ def handleDialog(dialog):
+ versionlb = get_state_as_dict(dialog.getChild("versionlb"))
+ # Log the state of the versionlb widget and exit.
+ positions.append(versionlb["SelectEntryPos"])
+ dialog.getChild("ok").executeAction("CLICK", tuple())
+
+ uiComponent = self.ui_test._xContext.ServiceManager.createInstanceWithContext("com.sun.star.comp.Writer.EPUBExportUIComponent", self.ui_test._xContext)
+ positions = []
+ for version in (20, 30):
+ filterData = (PropertyValue(Name="EPUBVersion", Value=version),)
+ propertyValues = (PropertyValue(Name="FilterData", Value=uno.Any("[]com.sun.star.beans.PropertyValue", filterData)),)
+ uiComponent.setPropertyValues(propertyValues)
+ self.ui_test.execute_blocking_action(action=uiComponent.execute, dialog_handler=handleDialog)
+ # Make sure that initializing with 2 different versions results in 2 different widget states.
+ self.assertEqual(2, len(set(positions)))
+
+ def testCoverImage(self):
+ def handleDialog(dialog):
+ dialog.getChild("coverpath").executeAction("TYPE", mkPropertyValues({"TEXT": "cover.png"}))
+ dialog.getChild("ok").executeAction("CLICK", tuple())
+
+ uiComponent = self.ui_test._xContext.ServiceManager.createInstanceWithContext("com.sun.star.comp.Writer.EPUBExportUIComponent", self.ui_test._xContext)
+
+ self.ui_test.execute_blocking_action(action=uiComponent.execute, dialog_handler=handleDialog)
+ propertyValues = uiComponent.getPropertyValues()
+ filterData = [i.Value for i in propertyValues if i.Name == "FilterData"][0]
+ # The RVNGCoverImage key was missing, EPUBExportDialog::OKClickHdl() did not set it.
+ coverImage = [i.Value for i in filterData if i.Name == "RVNGCoverImage"][0]
+ self.assertEqual("cover.png", coverImage)
+
+ def testMediaDir(self):
+ def handleDialog(dialog):
+ dialog.getChild("mediadir").executeAction("TYPE", mkPropertyValues({"TEXT": "file:///foo/bar"}))
+ dialog.getChild("ok").executeAction("CLICK", tuple())
+
+ uiComponent = self.ui_test._xContext.ServiceManager.createInstanceWithContext("com.sun.star.comp.Writer.EPUBExportUIComponent", self.ui_test._xContext)
+
+ self.ui_test.execute_blocking_action(action=uiComponent.execute, dialog_handler=handleDialog)
+ propertyValues = uiComponent.getPropertyValues()
+ filterData = [i.Value for i in propertyValues if i.Name == "FilterData"][0]
+ # The RVNGMediaDir key was missing, EPUBExportDialog::OKClickHdl() did not set it.
+ mediaDir = [i.Value for i in filterData if i.Name == "RVNGMediaDir"][0]
+ self.assertEqual("file:///foo/bar", mediaDir)
+
+ def testFixedLayout(self):
+ def handleDialog(dialog):
+ # Select the second entry to request fixed, not reflowable layout.
+ dialog.getChild("layoutlb").executeAction("SELECT", mkPropertyValues({"POS": "1"}))
+ dialog.getChild("ok").executeAction("CLICK", tuple())
+
+ uiComponent = self.ui_test._xContext.ServiceManager.createInstanceWithContext("com.sun.star.comp.Writer.EPUBExportUIComponent", self.ui_test._xContext)
+
+ self.ui_test.execute_blocking_action(action=uiComponent.execute, dialog_handler=handleDialog)
+ propertyValues = uiComponent.getPropertyValues()
+ filterData = [i.Value for i in propertyValues if i.Name == "FilterData"][0]
+ # The EPUBLayoutMethod key was missing, EPUBExportDialog::OKClickHdl() did not set it.
+ layout = [i.Value for i in filterData if i.Name == "EPUBLayoutMethod"][0]
+ # 1 stands for libepubgen::EPUB_LAYOUT_METHOD_FIXED.
+ self.assertEqual(1, layout)
+
+ def testMeta(self):
+ def handleDialog(dialog):
+ dialog.getChild("identifier").executeAction("TYPE", mkPropertyValues({"TEXT": "baddcafe-e394-4cd6-9b83-7172794612e5"}))
+ dialog.getChild("title").executeAction("TYPE", mkPropertyValues({"TEXT": "unknown title from ui"}))
+ dialog.getChild("author").executeAction("TYPE", mkPropertyValues({"TEXT": "unknown author from ui"}))
+ dialog.getChild("language").executeAction("TYPE", mkPropertyValues({"TEXT": "sk"}))
+ dialog.getChild("date").executeAction("TYPE", mkPropertyValues({"TEXT": "2013-11-20T17:16:07Z"}))
+ dialog.getChild("ok").executeAction("CLICK", tuple())
+
+ uiComponent = self.ui_test._xContext.ServiceManager.createInstanceWithContext("com.sun.star.comp.Writer.EPUBExportUIComponent", self.ui_test._xContext)
+
+ self.ui_test.execute_blocking_action(action=uiComponent.execute, dialog_handler=handleDialog)
+ propertyValues = uiComponent.getPropertyValues()
+ filterData = [i.Value for i in propertyValues if i.Name == "FilterData"][0]
+ # These keys were missing, EPUBExportDialog::OKClickHdl() did not set them.
+ identifier = [i.Value for i in filterData if i.Name == "RVNGIdentifier"][0]
+ self.assertEqual("baddcafe-e394-4cd6-9b83-7172794612e5", identifier)
+ title = [i.Value for i in filterData if i.Name == "RVNGTitle"][0]
+ self.assertEqual("unknown title from ui", title)
+ initialCreator = [i.Value for i in filterData if i.Name == "RVNGInitialCreator"][0]
+ self.assertEqual("unknown author from ui", initialCreator)
+ language = [i.Value for i in filterData if i.Name == "RVNGLanguage"][0]
+ self.assertEqual("sk", language)
+ date = [i.Value for i in filterData if i.Name == "RVNGDate"][0]
+ self.assertEqual("2013-11-20T17:16:07Z", date)
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/writerperfect/qa/unit/DirectoryStreamTest.cxx b/writerperfect/qa/unit/DirectoryStreamTest.cxx
new file mode 100644
index 000000000..8d8388dc3
--- /dev/null
+++ b/writerperfect/qa/unit/DirectoryStreamTest.cxx
@@ -0,0 +1,148 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <memory>
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <comphelper/processfactory.hxx>
+
+#include <ucbhelper/content.hxx>
+
+#include <test/bootstrapfixture.hxx>
+
+#include <DirectoryStream.hxx>
+#include <com/sun/star/ucb/XContent.hpp>
+
+namespace ucb = com::sun::star::ucb;
+namespace uno = com::sun::star::uno;
+
+using std::unique_ptr;
+
+using librevenge::RVNGInputStream;
+
+using writerperfect::DirectoryStream;
+
+namespace
+{
+class DirectoryStreamTest : public test::BootstrapFixture
+{
+public:
+ DirectoryStreamTest();
+
+public:
+ CPPUNIT_TEST_SUITE(DirectoryStreamTest);
+ CPPUNIT_TEST(testConstruction);
+ CPPUNIT_TEST(testDetection);
+ CPPUNIT_TEST(testDataOperations);
+ CPPUNIT_TEST(testStructuredOperations);
+ CPPUNIT_TEST_SUITE_END();
+
+private:
+ void testConstruction();
+ void testDetection();
+ void testDataOperations();
+ void testStructuredOperations();
+
+private:
+ uno::Reference<ucb::XContent> m_xDir;
+ uno::Reference<ucb::XContent> m_xFile;
+ uno::Reference<ucb::XContent> m_xNonexistent;
+};
+
+static const char g_aDirPath[] = "/writerperfect/qa/unit/data/stream/test.dir";
+static const char g_aNondirPath[] = "/writerperfect/qa/unit/data/stream/test.dir/mimetype";
+static const char g_aNonexistentPath[] = "/writerperfect/qa/unit/data/stream/foo/bar";
+
+DirectoryStreamTest::DirectoryStreamTest()
+{
+ const uno::Reference<ucb::XCommandEnvironment> xCmdEnv;
+ const uno::Reference<uno::XComponentContext> xContext(comphelper::getProcessComponentContext());
+
+ using ucbhelper::Content;
+
+ m_xDir = Content(m_directories.getURLFromSrc(g_aDirPath), xCmdEnv, xContext).get();
+ m_xFile = Content(m_directories.getURLFromSrc(g_aNondirPath), xCmdEnv, xContext).get();
+ m_xNonexistent
+ = Content(m_directories.getURLFromSrc(g_aNonexistentPath), xCmdEnv, xContext).get();
+}
+
+void DirectoryStreamTest::testConstruction()
+{
+ const unique_ptr<DirectoryStream> pDir(DirectoryStream::createForParent(m_xFile));
+ CPPUNIT_ASSERT(bool(pDir));
+ CPPUNIT_ASSERT(pDir->isStructured());
+
+ // this should work for dirs too
+ const unique_ptr<DirectoryStream> pDir2(DirectoryStream::createForParent(m_xDir));
+ CPPUNIT_ASSERT(bool(pDir2));
+ CPPUNIT_ASSERT(pDir2->isStructured());
+
+ // for nonexistent dirs nothing is created
+ const unique_ptr<DirectoryStream> pNondir(DirectoryStream::createForParent(m_xNonexistent));
+ CPPUNIT_ASSERT(!pNondir);
+
+ // even if we try harder, just an empty shell is created
+ DirectoryStream aNondir2(m_xNonexistent);
+ CPPUNIT_ASSERT(!aNondir2.isStructured());
+}
+
+void DirectoryStreamTest::testDetection()
+{
+ CPPUNIT_ASSERT(DirectoryStream::isDirectory(m_xDir));
+ CPPUNIT_ASSERT(!DirectoryStream::isDirectory(m_xFile));
+ CPPUNIT_ASSERT(!DirectoryStream::isDirectory(m_xNonexistent));
+}
+
+void lcl_testDataOperations(RVNGInputStream& rStream)
+{
+ CPPUNIT_ASSERT(rStream.isEnd());
+ CPPUNIT_ASSERT_EQUAL(0L, rStream.tell());
+ CPPUNIT_ASSERT_EQUAL(-1, rStream.seek(0, librevenge::RVNG_SEEK_CUR));
+
+ unsigned long numBytesRead = 0;
+ CPPUNIT_ASSERT(!rStream.read(1, numBytesRead));
+ CPPUNIT_ASSERT_EQUAL(0UL, numBytesRead);
+}
+
+void DirectoryStreamTest::testDataOperations()
+{
+ // data operations do not make sense on a directory -> just dummy
+ // impls.
+ DirectoryStream aDir(m_xDir);
+ lcl_testDataOperations(aDir);
+
+ // ... and they are equally empty if we try to pass a file
+ DirectoryStream aFile(m_xFile);
+ lcl_testDataOperations(aFile);
+}
+
+void lcl_testStructuredOperations(RVNGInputStream& rStream)
+{
+ CPPUNIT_ASSERT(rStream.isStructured());
+ unique_ptr<RVNGInputStream> pSubstream(rStream.getSubStreamByName("mimetype"));
+ CPPUNIT_ASSERT(bool(pSubstream));
+
+ // TODO: test for other operations when they are implemented =)
+}
+
+void DirectoryStreamTest::testStructuredOperations()
+{
+ DirectoryStream aDir(m_xDir);
+ lcl_testStructuredOperations(aDir);
+
+ unique_ptr<DirectoryStream> pDir(DirectoryStream::createForParent(m_xFile));
+ CPPUNIT_ASSERT(bool(pDir));
+ lcl_testStructuredOperations(*pDir);
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(DirectoryStreamTest);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/qa/unit/DrawingImportTest.cxx b/writerperfect/qa/unit/DrawingImportTest.cxx
new file mode 100644
index 000000000..6fb1f98ef
--- /dev/null
+++ b/writerperfect/qa/unit/DrawingImportTest.cxx
@@ -0,0 +1,156 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/drawing/XDrawPages.hpp>
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/drawing/XShapeDescriptor.hpp>
+#include <com/sun/star/drawing/XShapes.hpp>
+#include <com/sun/star/text/XText.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+#include <cppuhelper/supportsservice.hxx>
+
+#include <rtl/ref.hxx>
+
+#include <DocumentHandlerForOdg.hxx>
+#include <ImportFilter.hxx>
+#include "WpftFilterFixture.hxx"
+#include "WpftLoader.hxx"
+#include "wpftimport.hxx"
+
+namespace
+{
+namespace uno = css::uno;
+
+class DrawingImportFilter : public writerperfect::ImportFilter<OdgGenerator>
+{
+public:
+ explicit DrawingImportFilter(const uno::Reference<uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdgGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pWindow, librevenge::RVNGInputStream& rInput,
+ OdgGenerator& rGenerator,
+ utl::MediaDescriptor& rDescriptor) override;
+
+ static void generate(librevenge::RVNGDrawingInterface& rDocument);
+};
+
+bool DrawingImportFilter::doImportDocument(weld::Window*, librevenge::RVNGInputStream&,
+ OdgGenerator& rGenerator, utl::MediaDescriptor&)
+{
+ DrawingImportFilter::generate(rGenerator);
+ return true;
+}
+
+bool DrawingImportFilter::doDetectFormat(librevenge::RVNGInputStream&, OUString& rTypeName)
+{
+ rTypeName = "WpftDummyDrawing";
+ return true;
+}
+
+// XServiceInfo
+OUString SAL_CALL DrawingImportFilter::getImplementationName()
+{
+ return "org.libreoffice.comp.Wpft.QA.DrawingImportFilter";
+}
+
+sal_Bool SAL_CALL DrawingImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+uno::Sequence<OUString> SAL_CALL DrawingImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+void DrawingImportFilter::generate(librevenge::RVNGDrawingInterface& rDocument)
+{
+ using namespace librevenge;
+
+ rDocument.startDocument(RVNGPropertyList());
+ RVNGPropertyList aProps;
+ aProps.insert("svg:width", 800);
+ aProps.insert("svg:height", 600);
+ rDocument.startPage(aProps);
+ aProps.clear();
+ aProps.insert("svg:x", 50);
+ aProps.insert("svg:y", 50);
+ aProps.insert("svg:width", 200);
+ aProps.insert("svg:height", 100);
+ rDocument.startTextObject(aProps);
+ rDocument.openParagraph(RVNGPropertyList());
+ rDocument.openSpan(RVNGPropertyList());
+ rDocument.insertText("My hovercraft is full of eels.");
+ rDocument.closeSpan();
+ rDocument.closeParagraph();
+ rDocument.endTextObject();
+ rDocument.endPage();
+ rDocument.endDocument();
+}
+}
+
+namespace
+{
+class DrawingImportTest : public writerperfect::test::WpftFilterFixture
+{
+public:
+ void test();
+
+ CPPUNIT_TEST_SUITE(DrawingImportTest);
+ CPPUNIT_TEST(test);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+void DrawingImportTest::test()
+{
+ using namespace css;
+
+ rtl::Reference<DrawingImportFilter> xFilter{ new DrawingImportFilter(m_xContext) };
+ writerperfect::test::WpftLoader aLoader(createDummyInput(), xFilter.get(),
+ "private:factory/sdraw", m_xDesktop, m_xContext);
+
+ uno::Reference<drawing::XDrawPagesSupplier> xDoc(aLoader.getDocument(), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xDoc.is());
+ uno::Reference<drawing::XDrawPages> xPages = xDoc->getDrawPages();
+ CPPUNIT_ASSERT(xPages.is());
+ auto aPage = xPages->getByIndex(0);
+ uno::Reference<beans::XPropertySet> xPageProps;
+ CPPUNIT_ASSERT(aPage >>= xPageProps);
+ CPPUNIT_ASSERT(xPageProps.is());
+ sal_Int32 nProp = 0;
+ CPPUNIT_ASSERT(xPageProps->getPropertyValue("Height") >>= nProp);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(600), nProp);
+ CPPUNIT_ASSERT(xPageProps->getPropertyValue("Width") >>= nProp);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(800), nProp);
+ uno::Reference<drawing::XShapes> xShapes(xPageProps, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xShapes.is());
+ auto aShape = xShapes->getByIndex(0);
+ uno::Reference<drawing::XShapeDescriptor> xShapeDesc;
+ CPPUNIT_ASSERT(aShape >>= xShapeDesc);
+ CPPUNIT_ASSERT(xShapeDesc.is());
+ CPPUNIT_ASSERT_EQUAL(OUString("com.sun.star.drawing.TextShape"), xShapeDesc->getShapeType());
+ uno::Reference<text::XText> xText(xShapeDesc, uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(OUString("My hovercraft is full of eels."), xText->getString());
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(DrawingImportTest);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/qa/unit/EPUBExportTest.cxx b/writerperfect/qa/unit/EPUBExportTest.cxx
new file mode 100644
index 000000000..e6ca36fed
--- /dev/null
+++ b/writerperfect/qa/unit/EPUBExportTest.cxx
@@ -0,0 +1,880 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <libepubgen/libepubgen.h>
+
+#include <com/sun/star/document/XFilter.hpp>
+#include <com/sun/star/frame/Desktop.hpp>
+#include <com/sun/star/frame/XStorable.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/packages/zip/ZipFileAccess.hpp>
+
+#include <comphelper/propertysequence.hxx>
+#include <comphelper/string.hxx>
+#include <o3tl/safeint.hxx>
+#include <test/bootstrapfixture.hxx>
+#include <test/xmltesttools.hxx>
+#include <unotest/macros_test.hxx>
+#include <unotools/docinfohelper.hxx>
+#include <unotools/mediadescriptor.hxx>
+#include <unotools/tempfile.hxx>
+#include <unotools/ucbstreamhelper.hxx>
+
+using namespace ::com::sun::star;
+
+namespace
+{
+char const DATA_DIRECTORY[] = "/writerperfect/qa/unit/data/writer/epubexport/";
+
+/// Tests the EPUB export filter.
+class EPUBExportTest : public test::BootstrapFixture,
+ public unotest::MacrosTest,
+ public XmlTestTools
+{
+protected:
+ uno::Reference<lang::XComponent> mxComponent;
+ utl::TempFile maTempFile;
+ xmlDocUniquePtr mpXmlDoc;
+ uno::Reference<packages::zip::XZipFileAccess2> mxZipFile;
+ OUString maFilterOptions;
+
+public:
+ void setUp() override;
+ void tearDown() override;
+ void registerNamespaces(xmlXPathContextPtr& pXmlXpathCtx) override;
+ void createDoc(const OUString& rFile, const uno::Sequence<beans::PropertyValue>& rFilterData);
+ /// Returns an XML representation of the stream named rName in the exported package.
+ xmlDocUniquePtr parseExport(const OUString& rName);
+ /// Parses a CSS representation of the stream named rName and returns it.
+ std::map<OUString, std::vector<OUString>> parseCss(const OUString& rName);
+ /// Looks up a key of a class in rCss.
+ static OUString getCss(std::map<OUString, std::vector<OUString>>& rCss, const OUString& rClass,
+ const OUString& rKey);
+};
+
+void EPUBExportTest::setUp()
+{
+ test::BootstrapFixture::setUp();
+
+ mxDesktop.set(frame::Desktop::create(mxComponentContext));
+}
+
+void EPUBExportTest::tearDown()
+{
+ if (mxComponent.is())
+ mxComponent->dispose();
+
+ mpXmlDoc.reset();
+
+ test::BootstrapFixture::tearDown();
+}
+
+void EPUBExportTest::registerNamespaces(xmlXPathContextPtr& pXmlXpathCtx)
+{
+ xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("dc"), BAD_CAST("http://purl.org/dc/elements/1.1/"));
+ xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("opf"), BAD_CAST("http://www.idpf.org/2007/opf"));
+ xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("xhtml"), BAD_CAST("http://www.w3.org/1999/xhtml"));
+ xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("svg"), BAD_CAST("http://www.w3.org/2000/svg"));
+}
+
+void EPUBExportTest::createDoc(const OUString& rFile,
+ const uno::Sequence<beans::PropertyValue>& rFilterData)
+{
+ // Import the bugdoc and export as EPUB.
+ OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + rFile;
+ mxComponent = loadFromDesktop(aURL);
+ CPPUNIT_ASSERT(mxComponent.is());
+
+ uno::Reference<frame::XStorable> xStorable(mxComponent, uno::UNO_QUERY);
+ maTempFile.EnableKillingFile();
+ utl::MediaDescriptor aMediaDescriptor;
+ aMediaDescriptor["FilterName"] <<= OUString("EPUB");
+ if (maFilterOptions.isEmpty())
+ aMediaDescriptor["FilterData"] <<= rFilterData;
+ else
+ aMediaDescriptor["FilterOptions"] <<= maFilterOptions;
+ xStorable->storeToURL(maTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList());
+ mxZipFile
+ = packages::zip::ZipFileAccess::createWithURL(mxComponentContext, maTempFile.GetURL());
+}
+
+xmlDocUniquePtr EPUBExportTest::parseExport(const OUString& rName)
+{
+ uno::Reference<io::XInputStream> xInputStream(mxZipFile->getByName(rName), uno::UNO_QUERY);
+ std::unique_ptr<SvStream> pStream(utl::UcbStreamHelper::CreateStream(xInputStream, true));
+ return parseXmlStream(pStream.get());
+}
+
+std::map<OUString, std::vector<OUString>> EPUBExportTest::parseCss(const OUString& rName)
+{
+ std::map<OUString, std::vector<OUString>> aRet;
+
+ uno::Reference<io::XInputStream> xInputStream(mxZipFile->getByName(rName), uno::UNO_QUERY);
+ std::unique_ptr<SvStream> pStream(utl::UcbStreamHelper::CreateStream(xInputStream, true));
+
+ // Minimal CSS handler till orcus is up to our needs.
+ OString aLine;
+ OUString aRuleName;
+ while (!pStream->eof())
+ {
+ pStream->ReadLine(aLine);
+ if (aLine.endsWith("{"))
+ // '.name {' -> 'name'
+ aRuleName = OUString::fromUtf8(aLine.copy(1, aLine.getLength() - 3));
+ else if (aLine.endsWith(";"))
+ aRet[aRuleName].push_back(OUString::fromUtf8(aLine));
+ }
+
+ return aRet;
+}
+
+OUString EPUBExportTest::getCss(std::map<OUString, std::vector<OUString>>& rCss,
+ const OUString& rClass, const OUString& rKey)
+{
+ OUString aRet;
+
+ auto it = rCss.find(rClass);
+ CPPUNIT_ASSERT(it != rCss.end());
+
+ for (const auto& rKeyValue : it->second)
+ {
+ OUString aKeyValue = rKeyValue.trim();
+ std::vector<OUString> aTokens = comphelper::string::split(aKeyValue, ':');
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), aTokens.size());
+ if (aTokens[0].trim() == rKey)
+ {
+ aRet = aTokens[1].trim();
+ if (aRet.endsWith(";"))
+ // Ignore trailing semicolon.
+ aRet = aRet.copy(0, aRet.getLength() - 1);
+ break;
+ }
+ }
+
+ return aRet;
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testOutlineLevel)
+{
+ createDoc("outline-level.fodt", {});
+
+ // Make sure that the output is split into two.
+ CPPUNIT_ASSERT(mxZipFile->hasByName("OEBPS/sections/section0001.xhtml"));
+ // This failed, output was a single section.
+ CPPUNIT_ASSERT(mxZipFile->hasByName("OEBPS/sections/section0002.xhtml"));
+ CPPUNIT_ASSERT(!mxZipFile->hasByName("OEBPS/sections/section0003.xhtml"));
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testMimetype)
+{
+ createDoc("hello.fodt", {});
+
+ // Check that the mime type is written uncompressed at the expected location.
+ SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ);
+ SvMemoryStream aMemoryStream;
+ aMemoryStream.WriteStream(aFileStream);
+ OString aExpected("application/epub+zip");
+ CPPUNIT_ASSERT(aMemoryStream.GetSize() > static_cast<sal_uInt64>(aExpected.getLength()) + 38);
+
+ OString aActual(static_cast<const char*>(aMemoryStream.GetData()) + 38, aExpected.getLength());
+ // This failed: actual data was some garbage, not the uncompressed mime type.
+ CPPUNIT_ASSERT_EQUAL(aExpected, aActual);
+
+ mpXmlDoc = parseExport("OEBPS/content.opf");
+ // Default is EPUB3.
+ assertXPath(mpXmlDoc, "/opf:package", "version", "3.0");
+
+ // This was just "libepubgen/x.y.z", i.e. the LO version was missing.
+ OUString aGenerator
+ = getXPath(mpXmlDoc, "/opf:package/opf:metadata/opf:meta[@name='generator']", "content");
+ CPPUNIT_ASSERT(aGenerator.startsWith(utl::DocInfoHelper::GetGeneratorString()));
+
+ uno::Reference<lang::XMultiServiceFactory> xMSF(mxComponentContext->getServiceManager(),
+ uno::UNO_QUERY);
+ const OUString aServiceName("com.sun.star.comp.Writer.EPUBExportFilter");
+ uno::Reference<document::XFilter> xFilter(xMSF->createInstance(aServiceName), uno::UNO_QUERY);
+ // Should result in no errors.
+ xFilter->cancel();
+ // We got back what we expected.
+ uno::Reference<lang::XServiceInfo> xServiceInfo(xFilter, uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(aServiceName, xServiceInfo->getImplementationName());
+ CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.document.ExportFilter"));
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testEPUB2)
+{
+ uno::Sequence<beans::PropertyValue> aFilterData(comphelper::InitPropertySequence(
+ { // Explicitly request EPUB2.
+ { "EPUBVersion", uno::makeAny(static_cast<sal_Int32>(20)) } }));
+ createDoc("hello.fodt", aFilterData);
+
+ mpXmlDoc = parseExport("OEBPS/content.opf");
+ // This was 3.0, EPUBVersion filter option was ignored and we always emitted EPUB3.
+ assertXPath(mpXmlDoc, "/opf:package", "version", "2.0");
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testEPUBFixedLayout)
+{
+ uno::Sequence<beans::PropertyValue> aFilterData(comphelper::InitPropertySequence(
+ { // Explicitly request fixed layout.
+ { "EPUBLayoutMethod",
+ uno::makeAny(static_cast<sal_Int32>(libepubgen::EPUB_LAYOUT_METHOD_FIXED)) } }));
+ createDoc("hello.fodt", aFilterData);
+
+ mpXmlDoc = parseExport("OEBPS/content.opf");
+ // This was missing, EPUBLayoutMethod filter option was ignored and we always emitted reflowable layout.
+ assertXPathContent(mpXmlDoc, "/opf:package/opf:metadata/opf:meta[@property='rendition:layout']",
+ "pre-paginated");
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testEPUBFixedLayoutOption)
+{
+ // Explicitly request fixed layout, this time via FilterOptions.
+ maFilterOptions = "layout=fixed";
+ createDoc("hello.fodt", {});
+
+ // This failed, fixed layout was only working via the FilterData map.
+ mpXmlDoc = parseExport("OEBPS/content.opf");
+ assertXPathContent(mpXmlDoc, "/opf:package/opf:metadata/opf:meta[@property='rendition:layout']",
+ "pre-paginated");
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testEPUBFixedLayoutImplicitBreak)
+{
+ uno::Sequence<beans::PropertyValue> aFilterData(comphelper::InitPropertySequence(
+ { // Explicitly request fixed layout.
+ { "EPUBLayoutMethod",
+ uno::makeAny(static_cast<sal_Int32>(libepubgen::EPUB_LAYOUT_METHOD_FIXED)) } }));
+ createDoc("fxl-2page.fodt", aFilterData);
+
+ CPPUNIT_ASSERT(mxZipFile->hasByName("OEBPS/sections/section0001.xhtml"));
+ // This was missing, implicit page break (as calculated by the layout) was lost on export.
+ CPPUNIT_ASSERT(mxZipFile->hasByName("OEBPS/sections/section0002.xhtml"));
+ CPPUNIT_ASSERT(!mxZipFile->hasByName("OEBPS/sections/section0003.xhtml"));
+
+ // Make sure that fixed layout has chapter names in the navigation
+ // document.
+ mpXmlDoc = parseExport("OEBPS/toc.xhtml");
+ // This was 'Page 1' instead.
+ assertXPathContent(mpXmlDoc, "//xhtml:li[1]/xhtml:a", "First chapter");
+ assertXPathContent(mpXmlDoc, "//xhtml:li[2]/xhtml:a", "Second chapter");
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testPageBreakSplit)
+{
+ uno::Sequence<beans::PropertyValue> aFilterData(comphelper::InitPropertySequence(
+ { // Explicitly request split on page break (instead of on heading).
+ { "EPUBSplitMethod",
+ uno::makeAny(static_cast<sal_Int32>(libepubgen::EPUB_SPLIT_METHOD_PAGE_BREAK)) } }));
+ createDoc("2pages.fodt", aFilterData);
+
+ // Make sure that the output is split into two.
+ CPPUNIT_ASSERT(mxZipFile->hasByName("OEBPS/sections/section0001.xhtml"));
+ // This failed, output was a single section.
+ CPPUNIT_ASSERT(mxZipFile->hasByName("OEBPS/sections/section0002.xhtml"));
+ CPPUNIT_ASSERT(!mxZipFile->hasByName("OEBPS/sections/section0003.xhtml"));
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testSpanAutostyle)
+{
+ createDoc("span-autostyle.fodt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ assertXPath(mpXmlDoc, "//xhtml:p/xhtml:span[1]", "class", "span0");
+ // This failed, it was still span1, i.e. the bold and the italic formatting
+ // did not differ.
+ assertXPath(mpXmlDoc, "//xhtml:p/xhtml:span[2]", "class", "span1");
+ assertXPath(mpXmlDoc, "//xhtml:p/xhtml:span[3]", "class", "span2");
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testParaAutostyleCharProps)
+{
+ createDoc("para-autostyle-char-props.fodt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ // This failed, para-level char props were not exported.
+ assertXPath(mpXmlDoc, "//xhtml:p[1]/xhtml:span", "class", "span0");
+ assertXPath(mpXmlDoc, "//xhtml:p[2]/xhtml:span", "class", "span1");
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testMeta)
+{
+ createDoc("meta.fodt", {});
+
+ mpXmlDoc = parseExport("OEBPS/content.opf");
+ // This was "Unknown Author", <meta:initial-creator> was not handled.
+ assertXPathContent(mpXmlDoc, "/opf:package/opf:metadata/dc:creator", "A U Thor");
+ assertXPathContent(mpXmlDoc, "/opf:package/opf:metadata/dc:title", "Title");
+ assertXPathContent(mpXmlDoc, "/opf:package/opf:metadata/dc:language", "hu");
+ assertXPathContent(mpXmlDoc, "/opf:package/opf:metadata/opf:meta[@property='dcterms:modified']",
+ "2017-09-27T09:51:19Z");
+
+ // Make sure that cover image next to the source document is picked up.
+ assertXPath(mpXmlDoc, "/opf:package/opf:manifest/opf:item[@href='images/image0001.png']",
+ "properties", "cover-image");
+ assertXPath(mpXmlDoc, "/opf:package/opf:manifest/opf:item[@href='images/image0001.png']",
+ "media-type", "image/png");
+ CPPUNIT_ASSERT(mxZipFile->hasByName("OEBPS/images/image0001.png"));
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testMetaXMP)
+{
+ createDoc("meta-xmp.fodt", {});
+ mpXmlDoc = parseExport("OEBPS/content.opf");
+
+ // These were the libepubgen default values, metadata from a matching .xmp file was not picked up.
+ assertXPathContent(mpXmlDoc, "/opf:package/opf:metadata/dc:identifier",
+ "deadbeef-e394-4cd6-9b83-7172794612e5");
+ assertXPathContent(mpXmlDoc, "/opf:package/opf:metadata/dc:title", "unknown title from xmp");
+ assertXPathContent(mpXmlDoc, "/opf:package/opf:metadata/dc:creator", "unknown author from xmp");
+ assertXPathContent(mpXmlDoc, "/opf:package/opf:metadata/dc:language", "nl");
+ assertXPathContent(mpXmlDoc, "/opf:package/opf:metadata/opf:meta[@property='dcterms:modified']",
+ "2016-11-20T17:16:07Z");
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testMetaAPI)
+{
+ uno::Sequence<beans::PropertyValue> aFilterData(comphelper::InitPropertySequence(
+ { { "RVNGIdentifier", uno::makeAny(OUString("deadc0de-e394-4cd6-9b83-7172794612e5")) },
+ { "RVNGTitle", uno::makeAny(OUString("unknown title from api")) },
+ { "RVNGInitialCreator", uno::makeAny(OUString("unknown author from api")) },
+ { "RVNGLanguage", uno::makeAny(OUString("hu")) },
+ { "RVNGDate", uno::makeAny(OUString("2015-11-20T17:16:07Z")) } }));
+ createDoc("meta-xmp.fodt", aFilterData);
+ mpXmlDoc = parseExport("OEBPS/content.opf");
+
+ // These were values from XMP (deadbeef, etc.), not from API.
+ assertXPathContent(mpXmlDoc, "/opf:package/opf:metadata/dc:identifier",
+ "deadc0de-e394-4cd6-9b83-7172794612e5");
+ assertXPathContent(mpXmlDoc, "/opf:package/opf:metadata/dc:title", "unknown title from api");
+ assertXPathContent(mpXmlDoc, "/opf:package/opf:metadata/dc:creator", "unknown author from api");
+ assertXPathContent(mpXmlDoc, "/opf:package/opf:metadata/dc:language", "hu");
+ assertXPathContent(mpXmlDoc, "/opf:package/opf:metadata/opf:meta[@property='dcterms:modified']",
+ "2015-11-20T17:16:07Z");
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testCoverImage)
+{
+ OUString aCoverURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "meta.cover-image.png";
+ uno::Sequence<beans::PropertyValue> aFilterData(
+ comphelper::InitPropertySequence({ { "RVNGCoverImage", uno::makeAny(aCoverURL) } }));
+ createDoc("hello.fodt", aFilterData);
+ mpXmlDoc = parseExport("OEBPS/content.opf");
+
+ // Make sure that the explicitly set cover image is used.
+ // This failed, as the image was not part of the package.
+ assertXPath(mpXmlDoc, "/opf:package/opf:manifest/opf:item[@href='images/image0001.png']",
+ "properties", "cover-image");
+ assertXPath(mpXmlDoc, "/opf:package/opf:manifest/opf:item[@href='images/image0001.png']",
+ "media-type", "image/png");
+ CPPUNIT_ASSERT(mxZipFile->hasByName("OEBPS/images/image0001.png"));
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testParaNamedstyle)
+{
+ createDoc("para-namedstyle.fodt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ assertXPath(mpXmlDoc, "//xhtml:p[1]", "class", "para0");
+ // This failed, paragraph properties from style were not exported.
+ assertXPath(mpXmlDoc, "//xhtml:p[2]", "class", "para1");
+
+ // Test character properties from named paragraph style.
+ assertXPath(mpXmlDoc, "//xhtml:p[1]/xhtml:span", "class", "span0");
+ // This failed, character properties from paragraph style were not exported.
+ assertXPath(mpXmlDoc, "//xhtml:p[2]/xhtml:span", "class", "span1");
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testCharNamedstyle)
+{
+ createDoc("char-namedstyle.fodt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+
+ // Test character properties from named text style.
+ assertXPath(mpXmlDoc, "//xhtml:p/xhtml:span[1]", "class", "span0");
+ // This failed, character properties from text style were not exported.
+ assertXPath(mpXmlDoc, "//xhtml:p/xhtml:span[2]", "class", "span1");
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testNamedStyleInheritance)
+{
+ createDoc("named-style-inheritance.fodt", {});
+
+ // Find the CSS rule for the blue text.
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ std::map<OUString, std::vector<OUString>> aCssDoc = parseCss("OEBPS/styles/stylesheet.css");
+ OUString aBlue = getXPath(mpXmlDoc, "//xhtml:p[2]/xhtml:span[2]", "class");
+
+ CPPUNIT_ASSERT_EQUAL(OUString("#0000ff"), EPUBExportTest::getCss(aCssDoc, aBlue, "color"));
+ // This failed, the span only had the properties from its style, but not
+ // from the style's parent(s).
+ CPPUNIT_ASSERT_EQUAL(OUString("'Liberation Mono'"),
+ EPUBExportTest::getCss(aCssDoc, aBlue, "font-family"));
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testNestedSpan)
+{
+ createDoc("nested-span.fodt", {});
+
+ // Check textural content of nested span.
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ std::map<OUString, std::vector<OUString>> aCssDoc = parseCss("OEBPS/styles/stylesheet.css");
+ // This crashed, span had no content.
+ assertXPathContent(mpXmlDoc, "//xhtml:p/xhtml:span[2]", "red");
+
+ // Check formatting of nested span.
+ OUString aRed = getXPath(mpXmlDoc, "//xhtml:p/xhtml:span[2]", "class");
+ // This failed, direct formatting on top of named style was lost.
+ CPPUNIT_ASSERT_EQUAL(OUString("#ff0000"), EPUBExportTest::getCss(aCssDoc, aRed, "color"));
+ CPPUNIT_ASSERT_EQUAL(OUString("'Liberation Mono'"),
+ EPUBExportTest::getCss(aCssDoc, aRed, "font-family"));
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testLineBreak)
+{
+ createDoc("line-break.fodt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ // This was 0, line break was not handled.
+ assertXPath(mpXmlDoc, "//xhtml:p[1]/xhtml:span/xhtml:br", 1);
+ // This was 0, line break inside span was not handled.
+ assertXPath(mpXmlDoc, "//xhtml:p[2]/xhtml:span/xhtml:br", 1);
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testEscape)
+{
+ createDoc("escape.fodt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ // This was lost.
+ assertXPathContent(mpXmlDoc, "//xhtml:p[1]/xhtml:span[1]", OUString::fromUtf8("\xc2\xa0"));
+ // Make sure escaping happens only once.
+ assertXPathContent(mpXmlDoc, "//xhtml:p[1]/xhtml:span[2]", "a&b");
+ // This was also lost.
+ assertXPathContent(
+ mpXmlDoc, "//xhtml:p[1]/xhtml:span[3]",
+ OUString::fromUtf8("\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2"
+ "\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 "));
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testParaCharProps)
+{
+ createDoc("para-char-props.fodt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ std::map<OUString, std::vector<OUString>> aCssDoc = parseCss("OEBPS/styles/stylesheet.css");
+ // Check formatting of the middle span.
+ OUString aMiddle = getXPath(mpXmlDoc, "//xhtml:p/xhtml:span[2]", "class");
+ CPPUNIT_ASSERT_EQUAL(OUString("italic"),
+ EPUBExportTest::getCss(aCssDoc, aMiddle, "font-style"));
+ // Direct para formatting was lost, only direct char formatting was
+ // written, so this failed.
+ CPPUNIT_ASSERT_EQUAL(OUString("bold"), EPUBExportTest::getCss(aCssDoc, aMiddle, "font-weight"));
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testSection)
+{
+ createDoc("section.fodt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ // This was "After.", i.e. in-section content was ignored.
+ assertXPathContent(mpXmlDoc, "//xhtml:p[2]/xhtml:span", "In section.");
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testList)
+{
+ createDoc("list.fodt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ // This was "C", i.e. in-list content was ignored.
+ assertXPathContent(mpXmlDoc, "//xhtml:p[2]/xhtml:span", "B");
+ // Test nested list content.
+ assertXPathContent(mpXmlDoc, "//xhtml:p[6]/xhtml:span", "F");
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testImage)
+{
+ createDoc("image.fodt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ assertXPath(mpXmlDoc, "//xhtml:p/xhtml:img", 1);
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testImageBorder)
+{
+ createDoc("image-border.fodt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ std::map<OUString, std::vector<OUString>> aCssDoc = parseCss("OEBPS/styles/stylesheet.css");
+
+ OUString aClass = getXPath(mpXmlDoc, "//xhtml:img", "class");
+ // This failed, image had no border.
+ CPPUNIT_ASSERT_EQUAL(OUString("0.99pt dashed #ed1c24"),
+ EPUBExportTest::getCss(aCssDoc, aClass, "border"));
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testImageNospan)
+{
+ createDoc("image-nospan.fodt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ // Image outside a span was lost.
+ assertXPath(mpXmlDoc, "//xhtml:p/xhtml:img", 1);
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testTable)
+{
+ createDoc("table.fodt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ assertXPath(mpXmlDoc, "//xhtml:table/xhtml:tbody/xhtml:tr/xhtml:td", 4);
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testTableRowSpan)
+{
+ createDoc("table-row-span.fodt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ // This failed, row span wasn't exported.
+ assertXPath(mpXmlDoc, "//xhtml:table/xhtml:tbody/xhtml:tr[1]/xhtml:td[1]", "rowspan", "2");
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testTableCellBorder)
+{
+ createDoc("table-cell-border.fodt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ std::map<OUString, std::vector<OUString>> aCssDoc = parseCss("OEBPS/styles/stylesheet.css");
+
+ OUString aClass
+ = getXPath(mpXmlDoc, "//xhtml:table/xhtml:tbody/xhtml:tr[1]/xhtml:td[1]", "class");
+ // This failed, cell border wasn't exported.
+ CPPUNIT_ASSERT_EQUAL(OUString("0.05pt solid #000000"),
+ EPUBExportTest::getCss(aCssDoc, aClass, "border-left"));
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testTableCellWidth)
+{
+ createDoc("table-cell-width.fodt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ std::map<OUString, std::vector<OUString>> aCssDoc = parseCss("OEBPS/styles/stylesheet.css");
+ OUString aClass1
+ = getXPath(mpXmlDoc, "//xhtml:table/xhtml:tbody/xhtml:tr[1]/xhtml:td[1]", "class");
+ OUString aClass2
+ = getXPath(mpXmlDoc, "//xhtml:table/xhtml:tbody/xhtml:tr[1]/xhtml:td[2]", "class");
+ OUString aClass3
+ = getXPath(mpXmlDoc, "//xhtml:table/xhtml:tbody/xhtml:tr[1]/xhtml:td[3]", "class");
+ // These failed, all widths were 0.
+ CPPUNIT_ASSERT_GREATER(EPUBExportTest::getCss(aCssDoc, aClass2, "width").toDouble(),
+ EPUBExportTest::getCss(aCssDoc, aClass1, "width").toDouble());
+ CPPUNIT_ASSERT_GREATER(EPUBExportTest::getCss(aCssDoc, aClass3, "width").toDouble(),
+ EPUBExportTest::getCss(aCssDoc, aClass1, "width").toDouble());
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testTableRowHeight)
+{
+ createDoc("table-row-height.fodt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ std::map<OUString, std::vector<OUString>> aCssDoc = parseCss("OEBPS/styles/stylesheet.css");
+ OUString aClass1 = getXPath(mpXmlDoc, "//xhtml:table/xhtml:tbody/xhtml:tr[1]", "class");
+ OUString aClass2 = getXPath(mpXmlDoc, "//xhtml:table/xhtml:tbody/xhtml:tr[2]", "class");
+ // These failed, both heights were 0.
+ CPPUNIT_ASSERT_GREATER(EPUBExportTest::getCss(aCssDoc, aClass2, "height").toDouble(),
+ EPUBExportTest::getCss(aCssDoc, aClass1, "height").toDouble());
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testLink)
+{
+ createDoc("link.fodt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ assertXPathContent(mpXmlDoc, "//xhtml:p/xhtml:a/xhtml:span", "https://libreoffice.org/");
+ assertXPath(mpXmlDoc, "//xhtml:p/xhtml:a", "href", "https://libreoffice.org/");
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testLinkInvalid)
+{
+ createDoc("link-invalid.odt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ // This was 1, invalid relative link was not filtered out.
+ assertXPath(mpXmlDoc, "//xhtml:p/xhtml:a", 0);
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testLinkCharFormat)
+{
+ createDoc("link-charformat.fodt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ // <span> was lost, link text having a char format was missing.
+ assertXPathContent(mpXmlDoc, "//xhtml:p/xhtml:a/xhtml:span", "https://libreoffice.org/");
+ assertXPath(mpXmlDoc, "//xhtml:p/xhtml:a", "href", "https://libreoffice.org/");
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testLinkNamedCharFormat)
+{
+ // Character properties from named character style on hyperlink was lost.
+ createDoc("link-namedcharformat.fodt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ std::map<OUString, std::vector<OUString>> aCssDoc = parseCss("OEBPS/styles/stylesheet.css");
+ // This failed, there was no span inside the hyperlink.
+ assertXPathContent(mpXmlDoc, "//xhtml:p/xhtml:a/xhtml:span", "http://libreoffice.org");
+ assertXPath(mpXmlDoc, "//xhtml:p/xhtml:a", "href", "http://libreoffice.org/");
+
+ OUString aClass = getXPath(mpXmlDoc, "//xhtml:p/xhtml:a/xhtml:span", "class");
+ CPPUNIT_ASSERT_EQUAL(OUString("#ff0000"), EPUBExportTest::getCss(aCssDoc, aClass, "color"));
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testTableWidth)
+{
+ createDoc("table-width.fodt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ std::map<OUString, std::vector<OUString>> aCssDoc = parseCss("OEBPS/styles/stylesheet.css");
+
+ OUString aClass = getXPath(mpXmlDoc, "//xhtml:table", "class");
+ // This failed, relative total width of table was lost.
+ CPPUNIT_ASSERT_EQUAL(OUString("50%"), EPUBExportTest::getCss(aCssDoc, aClass, "width"));
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testTextBox)
+{
+ createDoc("text-box.fodt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ std::map<OUString, std::vector<OUString>> aCssDoc = parseCss("OEBPS/styles/stylesheet.css");
+
+ // This failed, image with caption was lost.
+ assertXPath(mpXmlDoc, "//xhtml:img", "class", "frame1");
+ // Expected spans:
+ // 1) break after the image
+ // 2) "Illustration "
+ // 3) The sequence field, this was missing (was ": foo" instead).
+ assertXPathContent(mpXmlDoc, "//xhtml:div/xhtml:p/xhtml:span[3]", "1");
+
+ OUString aClass = getXPath(mpXmlDoc, "//xhtml:div/xhtml:p/xhtml:span[3]", "class");
+ // This failed, the 3rd span was not italic.
+ CPPUNIT_ASSERT_EQUAL(OUString("italic"), EPUBExportTest::getCss(aCssDoc, aClass, "font-style"));
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testFontEmbedding)
+{
+#if !defined(MACOSX)
+ createDoc("font-embedding.fodt", {});
+
+ // Make sure that the params of defineEmbeddedFont() are all handled.
+ // librevenge:name
+ std::map<OUString, std::vector<OUString>> aCssDoc = parseCss("OEBPS/styles/stylesheet.css");
+ // 'SketchFlow Print' or ''SketchFlow Print1'
+ CPPUNIT_ASSERT(EPUBExportTest::getCss(aCssDoc, "font-face", "font-family")
+ .startsWith("'SketchFlow Print"));
+ // librevenge:mime-type
+ mpXmlDoc = parseExport("OEBPS/content.opf");
+ assertXPath(mpXmlDoc, "/opf:package/opf:manifest/opf:item[@href='fonts/font0001.otf']",
+ "media-type", "application/vnd.ms-opentype");
+ // office:binary-data
+ CPPUNIT_ASSERT(mxZipFile->hasByName("OEBPS/fonts/font0001.otf"));
+ // librevenge:font-style
+ CPPUNIT_ASSERT_EQUAL(OUString("normal"),
+ EPUBExportTest::getCss(aCssDoc, "font-face", "font-style"));
+ // librevenge:font-weight
+ CPPUNIT_ASSERT_EQUAL(OUString("normal"),
+ EPUBExportTest::getCss(aCssDoc, "font-face", "font-weight"));
+#endif
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testImageLink)
+{
+ createDoc("image-link.fodt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ // This failed, image was missing.
+ assertXPath(mpXmlDoc, "//xhtml:p/xhtml:a/xhtml:img", 1);
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testFootnote)
+{
+ createDoc("footnote.fodt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ // These were missing, footnote was lost.
+ assertXPath(mpXmlDoc, "//xhtml:body/xhtml:p/xhtml:sup/xhtml:a", "type", "noteref");
+ assertXPath(mpXmlDoc, "//xhtml:body/xhtml:aside", "type", "footnote");
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testPopup)
+{
+ createDoc("popup.odt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ // Test image popup anchor.
+ assertXPath(mpXmlDoc, "//xhtml:body/xhtml:p[1]/xhtml:a", "type", "noteref");
+ assertXPath(mpXmlDoc, "//xhtml:body/xhtml:p[1]/xhtml:a/xhtml:img", 1);
+ // Test image popup content.
+ assertXPath(mpXmlDoc, "//xhtml:body/xhtml:aside[1]", "type", "footnote");
+ assertXPath(mpXmlDoc, "//xhtml:body/xhtml:aside[1]/xhtml:img", 1);
+
+ // Test text popup anchor.
+ assertXPath(mpXmlDoc, "//xhtml:body/xhtml:p[2]/xhtml:span/xhtml:a", "type", "noteref");
+ assertXPathContent(mpXmlDoc, "//xhtml:body/xhtml:p[2]/xhtml:span/xhtml:a", "link");
+ // Test text popup content.
+ assertXPath(mpXmlDoc, "//xhtml:body/xhtml:aside[2]", "type", "footnote");
+ assertXPath(mpXmlDoc, "//xhtml:body/xhtml:aside[2]/xhtml:img", 1);
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testPopupMedia)
+{
+ // This is the same as testPopup(), but the links point to images in the
+ // default media directory, not in the document directory.
+ createDoc("popup-media.odt", {});
+
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ // Test image popup anchor. This failed, number of XPath nodes was 0.
+ assertXPath(mpXmlDoc, "//xhtml:body/xhtml:p[1]/xhtml:a", "type", "noteref");
+ assertXPath(mpXmlDoc, "//xhtml:body/xhtml:p[1]/xhtml:a/xhtml:img", 1);
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testPopupAPI)
+{
+ // Make sure that the popup works with data from a media directory.
+ OUString aMediaDir = m_directories.getURLFromSrc(DATA_DIRECTORY) + "popup";
+ uno::Sequence<beans::PropertyValue> aFilterData(
+ comphelper::InitPropertySequence({ { "RVNGMediaDir", uno::makeAny(aMediaDir) } }));
+ createDoc("popup-api.odt", aFilterData);
+
+ // We have a non-empty anchor image.
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ OUString aAnchor = getXPath(mpXmlDoc, "//xhtml:body/xhtml:p[1]/xhtml:a/xhtml:img", "src");
+ CPPUNIT_ASSERT(!aAnchor.isEmpty());
+ // We have a non-empty popup image.
+ OUString aData = getXPath(mpXmlDoc, "//xhtml:body/xhtml:aside[1]/xhtml:img", "src");
+ CPPUNIT_ASSERT(!aData.isEmpty());
+ // The anchor is different from the popup image.
+ CPPUNIT_ASSERT(aAnchor != aData);
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testPageSize)
+{
+ uno::Sequence<beans::PropertyValue> aFilterData(comphelper::InitPropertySequence(
+ { { "EPUBLayoutMethod",
+ uno::makeAny(static_cast<sal_Int32>(libepubgen::EPUB_LAYOUT_METHOD_FIXED)) } }));
+ createDoc("hello.fodt", aFilterData);
+
+ // This failed, viewport was empty, so page size was lost.
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ // 21,59cm x 27.94cm (letter).
+ assertXPath(mpXmlDoc, "/xhtml:html/xhtml:head/xhtml:meta[@name='viewport']", "content",
+ "width=816, height=1056");
+
+ mpXmlDoc = parseExport("OEBPS/images/image0001.svg");
+ // This was 288mm, logic->logic conversion input was a pixel value.
+ assertXPath(mpXmlDoc, "/svg:svg", "width", "216mm");
+ assertXPath(mpXmlDoc, "/svg:svg", "height", "279mm");
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testSVG)
+{
+ uno::Sequence<beans::PropertyValue> aFilterData(comphelper::InitPropertySequence(
+ { { "EPUBLayoutMethod",
+ uno::makeAny(static_cast<sal_Int32>(libepubgen::EPUB_LAYOUT_METHOD_FIXED)) } }));
+ createDoc("hello.fodt", aFilterData);
+
+ CPPUNIT_ASSERT(mxZipFile->hasByName("OEBPS/images/image0001.svg"));
+ uno::Reference<io::XInputStream> xInputStream(
+ mxZipFile->getByName("OEBPS/images/image0001.svg"), uno::UNO_QUERY);
+ std::unique_ptr<SvStream> pStream(utl::UcbStreamHelper::CreateStream(xInputStream, true));
+
+ SvMemoryStream aMemoryStream;
+ aMemoryStream.WriteStream(*pStream);
+ OString aExpected("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<svg");
+ CPPUNIT_ASSERT(aMemoryStream.GetSize() > o3tl::make_unsigned(aExpected.getLength()));
+
+ // This failed, there was a '<!DOCTYPE' line between the xml and the svg
+ // one, causing a validation error.
+ OString aActual(static_cast<const char*>(aMemoryStream.GetData()), aExpected.getLength());
+ CPPUNIT_ASSERT_EQUAL(aExpected, aActual);
+
+ // This failed, we used the xlink attribute namespace, but we did not
+ // define its URL.
+ mpXmlDoc = parseExport("OEBPS/images/image0001.svg");
+ assertXPathNSDef(mpXmlDoc, "/svg:svg", "xlink", "http://www.w3.org/1999/xlink");
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testTdf115623SingleWritingMode)
+{
+ // Simple page that has single writing mode should work.
+ createDoc("tdf115623-single-writing-mode.odt", {});
+ std::map<OUString, std::vector<OUString>> aCssDoc = parseCss("OEBPS/styles/stylesheet.css");
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ OUString aClass = getXPath(mpXmlDoc, "//xhtml:body", "class");
+ CPPUNIT_ASSERT_EQUAL(OUString("vertical-rl"),
+ EPUBExportTest::getCss(aCssDoc, aClass, "writing-mode"));
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testTdf115623SplitByChapter)
+{
+ createDoc("tdf115623-split-by-chapter.odt", {});
+ std::map<OUString, std::vector<OUString>> aCssDoc = parseCss("OEBPS/styles/stylesheet.css");
+ {
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ OUString aClass = getXPath(mpXmlDoc, "//xhtml:body", "class");
+ CPPUNIT_ASSERT_EQUAL(OUString("vertical-rl"),
+ EPUBExportTest::getCss(aCssDoc, aClass, "writing-mode"));
+ }
+ // Split HTML should keep the same writing-mode.
+ {
+ mpXmlDoc = parseExport("OEBPS/sections/section0002.xhtml");
+ OUString aClass = getXPath(mpXmlDoc, "//xhtml:body", "class");
+ CPPUNIT_ASSERT_EQUAL(OUString("vertical-rl"),
+ EPUBExportTest::getCss(aCssDoc, aClass, "writing-mode"));
+ }
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testTdf115623ManyPageSpans)
+{
+ createDoc("tdf115623-many-pagespans.odt", {});
+ std::map<OUString, std::vector<OUString>> aCssDoc = parseCss("OEBPS/styles/stylesheet.css");
+ // Two pages should have different writing modes.
+ {
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ OUString aClass = getXPath(mpXmlDoc, "//xhtml:body", "class");
+ CPPUNIT_ASSERT_EQUAL(OUString("vertical-rl"),
+ EPUBExportTest::getCss(aCssDoc, aClass, "writing-mode"));
+ }
+ {
+ mpXmlDoc = parseExport("OEBPS/sections/section0002.xhtml");
+ OUString aClass = getXPath(mpXmlDoc, "//xhtml:body", "class");
+ CPPUNIT_ASSERT_EQUAL(OUString("horizontal-tb"),
+ EPUBExportTest::getCss(aCssDoc, aClass, "writing-mode"));
+ }
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testSimpleRuby)
+{
+ createDoc("simple-ruby.odt", {});
+ mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
+ assertXPathContent(mpXmlDoc, "//xhtml:body/xhtml:p/xhtml:ruby/xhtml:span", "base text");
+ assertXPathContent(mpXmlDoc, "//xhtml:body/xhtml:p/xhtml:ruby/xhtml:rt", "ruby text");
+}
+
+CPPUNIT_TEST_FIXTURE(EPUBExportTest, testAbi11105)
+{
+ // This crashed because the paragraph style "P5" which had a master-page-name
+ // appeared in a table cell messed up page spans.
+ createDoc("abi11105.abw", {});
+}
+}
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/qa/unit/ImportTest.cxx b/writerperfect/qa/unit/ImportTest.cxx
new file mode 100644
index 000000000..07c82d413
--- /dev/null
+++ b/writerperfect/qa/unit/ImportTest.cxx
@@ -0,0 +1,119 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/container/XIndexAccess.hpp>
+#include <com/sun/star/document/XFilter.hpp>
+#include <com/sun/star/document/XTypeDetection.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/sheet/XSpreadsheetDocument.hpp>
+#include <com/sun/star/table/XCellRange.hpp>
+
+#include <unotools/mediadescriptor.hxx>
+
+#include "WpftFilterFixture.hxx"
+#include "WpftLoader.hxx"
+
+namespace
+{
+namespace beans = css::beans;
+namespace container = css::container;
+namespace document = css::document;
+namespace lang = css::lang;
+namespace sheet = css::sheet;
+namespace table = css::table;
+namespace uno = css::uno;
+
+using uno::UNO_QUERY;
+
+using writerperfect::test::WpftLoader;
+
+class ImportTest : public writerperfect::test::WpftFilterFixture
+{
+public:
+ virtual void setUp() override;
+
+ void testWK3WithFM3();
+
+ CPPUNIT_TEST_SUITE(ImportTest);
+ CPPUNIT_TEST(testWK3WithFM3);
+ CPPUNIT_TEST_SUITE_END();
+
+private:
+ WpftLoader createCalcLoader(const OUString& rFile) const;
+
+ WpftLoader createLoader(const OUString& rUrl, const OUString& rFactoryUrl) const;
+
+ OUString makeUrl(const OUString& rFile) const;
+
+private:
+ uno::Reference<lang::XMultiServiceFactory> m_xFilterFactory;
+};
+
+void ImportTest::setUp()
+{
+ writerperfect::test::WpftFilterFixture::setUp();
+
+ m_xFilterFactory.set(
+ m_xFactory->createInstanceWithContext("com.sun.star.document.FilterFactory", m_xContext),
+ UNO_QUERY);
+ assert(m_xFilterFactory.is());
+}
+
+void ImportTest::testWK3WithFM3()
+{
+ WpftLoader aLoader(createCalcLoader("SOLVE.WK3"));
+ uno::Reference<sheet::XSpreadsheetDocument> xDoc(aLoader.getDocument(), UNO_QUERY);
+ CPPUNIT_ASSERT(xDoc.is());
+ uno::Reference<container::XIndexAccess> xSheets(xDoc->getSheets(), UNO_QUERY);
+ CPPUNIT_ASSERT(xSheets.is());
+ uno::Reference<table::XCellRange> xSheet(xSheets->getByIndex(0), UNO_QUERY);
+ CPPUNIT_ASSERT(xSheet.is());
+ uno::Reference<beans::XPropertySet> xCellProps(xSheet->getCellByPosition(1, 1), UNO_QUERY);
+ CPPUNIT_ASSERT(xCellProps.is());
+ sal_Int32 nCharColor = 0;
+ CPPUNIT_ASSERT(xCellProps->getPropertyValue("CharColor") >>= nCharColor);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0x0000ff), nCharColor); // blue text
+}
+
+WpftLoader ImportTest::createCalcLoader(const OUString& rFile) const
+{
+ return createLoader(makeUrl(rFile), "private:factory/scalc");
+}
+
+WpftLoader ImportTest::createLoader(const OUString& rUrl, const OUString& rFactoryUrl) const
+{
+ utl::MediaDescriptor aDesc;
+ aDesc[utl::MediaDescriptor::PROP_URL()] <<= rUrl;
+ aDesc[utl::MediaDescriptor::PROP_READONLY()] <<= true;
+ uno::Sequence<beans::PropertyValue> lDesc(aDesc.getAsConstPropertyValueList());
+ m_xTypeDetection->queryTypeByDescriptor(lDesc, true);
+ aDesc = lDesc;
+ OUString sFilter;
+ aDesc[utl::MediaDescriptor::PROP_FILTERNAME()] >>= sFilter;
+ CPPUNIT_ASSERT(!sFilter.isEmpty());
+ const uno::Reference<document::XFilter> xFilter(m_xFilterFactory->createInstance(sFilter),
+ UNO_QUERY);
+ CPPUNIT_ASSERT(xFilter.is());
+ return WpftLoader(rUrl, xFilter, rFactoryUrl, m_xDesktop, m_xTypeMap, m_xContext);
+}
+
+OUString ImportTest::makeUrl(const OUString& rFile) const
+{
+ return const_cast<ImportTest*>(this)->m_directories.getURLFromSrc("/" TEST_DIR "/" + rFile);
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(ImportTest);
+}
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/qa/unit/PresentationImportTest.cxx b/writerperfect/qa/unit/PresentationImportTest.cxx
new file mode 100644
index 000000000..e1414dec5
--- /dev/null
+++ b/writerperfect/qa/unit/PresentationImportTest.cxx
@@ -0,0 +1,156 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/drawing/XDrawPages.hpp>
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/drawing/XShapeDescriptor.hpp>
+#include <com/sun/star/drawing/XShapes.hpp>
+#include <com/sun/star/text/XText.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+#include <cppuhelper/supportsservice.hxx>
+
+#include <rtl/ref.hxx>
+
+#include <DocumentHandlerForOdp.hxx>
+#include <ImportFilter.hxx>
+#include "WpftFilterFixture.hxx"
+#include "WpftLoader.hxx"
+#include "wpftimport.hxx"
+
+namespace
+{
+namespace uno = css::uno;
+
+class PresentationImportFilter : public writerperfect::ImportFilter<OdpGenerator>
+{
+public:
+ explicit PresentationImportFilter(const uno::Reference<uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdpGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pWindow, librevenge::RVNGInputStream& rInput,
+ OdpGenerator& rGenerator,
+ utl::MediaDescriptor& rDescriptor) override;
+
+ static void generate(librevenge::RVNGPresentationInterface& rDocument);
+};
+
+bool PresentationImportFilter::doImportDocument(weld::Window*, librevenge::RVNGInputStream&,
+ OdpGenerator& rGenerator, utl::MediaDescriptor&)
+{
+ PresentationImportFilter::generate(rGenerator);
+ return true;
+}
+
+bool PresentationImportFilter::doDetectFormat(librevenge::RVNGInputStream&, OUString& rTypeName)
+{
+ rTypeName = "WpftDummyPresentation";
+ return true;
+}
+
+// XServiceInfo
+OUString SAL_CALL PresentationImportFilter::getImplementationName()
+{
+ return "org.libreoffice.comp.Wpft.QA.PresentationImportFilter";
+}
+
+sal_Bool SAL_CALL PresentationImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+uno::Sequence<OUString> SAL_CALL PresentationImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+void PresentationImportFilter::generate(librevenge::RVNGPresentationInterface& rDocument)
+{
+ using namespace librevenge;
+
+ rDocument.startDocument(RVNGPropertyList());
+ RVNGPropertyList aProps;
+ aProps.insert("svg:width", 800);
+ aProps.insert("svg:height", 600);
+ rDocument.startSlide(aProps);
+ aProps.clear();
+ aProps.insert("svg:x", 50);
+ aProps.insert("svg:y", 50);
+ aProps.insert("svg:width", 200);
+ aProps.insert("svg:height", 100);
+ rDocument.startTextObject(aProps);
+ rDocument.openParagraph(RVNGPropertyList());
+ rDocument.openSpan(RVNGPropertyList());
+ rDocument.insertText("My hovercraft is full of eels.");
+ rDocument.closeSpan();
+ rDocument.closeParagraph();
+ rDocument.endTextObject();
+ rDocument.endSlide();
+ rDocument.endDocument();
+}
+}
+
+namespace
+{
+class PresentationImportTest : public writerperfect::test::WpftFilterFixture
+{
+public:
+ void test();
+
+ CPPUNIT_TEST_SUITE(PresentationImportTest);
+ CPPUNIT_TEST(test);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+void PresentationImportTest::test()
+{
+ using namespace css;
+
+ rtl::Reference<PresentationImportFilter> xFilter{ new PresentationImportFilter(m_xContext) };
+ writerperfect::test::WpftLoader aLoader(createDummyInput(), xFilter.get(),
+ "private:factory/simpress", m_xDesktop, m_xContext);
+
+ uno::Reference<drawing::XDrawPagesSupplier> xDoc(aLoader.getDocument(), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xDoc.is());
+ uno::Reference<drawing::XDrawPages> xPages = xDoc->getDrawPages();
+ CPPUNIT_ASSERT(xPages.is());
+ auto aPage = xPages->getByIndex(0);
+ uno::Reference<beans::XPropertySet> xPageProps;
+ CPPUNIT_ASSERT(aPage >>= xPageProps);
+ CPPUNIT_ASSERT(xPageProps.is());
+ sal_Int32 nProp = 0;
+ CPPUNIT_ASSERT(xPageProps->getPropertyValue("Height") >>= nProp);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(600), nProp);
+ CPPUNIT_ASSERT(xPageProps->getPropertyValue("Width") >>= nProp);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(800), nProp);
+ uno::Reference<drawing::XShapes> xShapes(xPageProps, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xShapes.is());
+ auto aShape = xShapes->getByIndex(0);
+ uno::Reference<drawing::XShapeDescriptor> xShapeDesc;
+ CPPUNIT_ASSERT(aShape >>= xShapeDesc);
+ CPPUNIT_ASSERT(xShapeDesc.is());
+ CPPUNIT_ASSERT_EQUAL(OUString("com.sun.star.drawing.TextShape"), xShapeDesc->getShapeType());
+ uno::Reference<text::XText> xText(xShapeDesc, uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(OUString("My hovercraft is full of eels."), xText->getString());
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(PresentationImportTest);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/qa/unit/SpreadsheetImportTest.cxx b/writerperfect/qa/unit/SpreadsheetImportTest.cxx
new file mode 100644
index 000000000..caf5d4de9
--- /dev/null
+++ b/writerperfect/qa/unit/SpreadsheetImportTest.cxx
@@ -0,0 +1,138 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <com/sun/star/container/XIndexAccess.hpp>
+#include <com/sun/star/sheet/XSpreadsheetDocument.hpp>
+#include <com/sun/star/table/XCell.hpp>
+#include <com/sun/star/table/XCellRange.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+#include <cppuhelper/supportsservice.hxx>
+
+#include <rtl/ref.hxx>
+
+#include <DocumentHandlerForOds.hxx>
+#include <ImportFilter.hxx>
+#include "WpftFilterFixture.hxx"
+#include "WpftLoader.hxx"
+#include "wpftimport.hxx"
+
+namespace
+{
+namespace uno = css::uno;
+
+class SpreadsheetImportFilter : public writerperfect::ImportFilter<OdsGenerator>
+{
+public:
+ explicit SpreadsheetImportFilter(const uno::Reference<uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdsGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pWindow, librevenge::RVNGInputStream& rInput,
+ OdsGenerator& rGenerator,
+ utl::MediaDescriptor& rDescriptor) override;
+
+ static void generate(librevenge::RVNGSpreadsheetInterface& rDocument);
+};
+
+bool SpreadsheetImportFilter::doImportDocument(weld::Window*, librevenge::RVNGInputStream&,
+ OdsGenerator& rGenerator, utl::MediaDescriptor&)
+{
+ SpreadsheetImportFilter::generate(rGenerator);
+ return true;
+}
+
+bool SpreadsheetImportFilter::doDetectFormat(librevenge::RVNGInputStream&, OUString& rTypeName)
+{
+ rTypeName = "WpftDummySpreadsheet";
+ return true;
+}
+
+// XServiceInfo
+OUString SAL_CALL SpreadsheetImportFilter::getImplementationName()
+{
+ return "org.libreoffice.comp.Wpft.QA.SpreadsheetImportFilter";
+}
+
+sal_Bool SAL_CALL SpreadsheetImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+uno::Sequence<OUString> SAL_CALL SpreadsheetImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+void SpreadsheetImportFilter::generate(librevenge::RVNGSpreadsheetInterface& rDocument)
+{
+ using namespace librevenge;
+
+ rDocument.startDocument(RVNGPropertyList());
+ rDocument.openPageSpan(RVNGPropertyList());
+ rDocument.openSheet(RVNGPropertyList());
+ rDocument.openSheetRow(RVNGPropertyList());
+ rDocument.openSheetCell(RVNGPropertyList());
+ rDocument.openParagraph(RVNGPropertyList());
+ rDocument.openSpan(RVNGPropertyList());
+ rDocument.insertText("My hovercraft is full of eels.");
+ rDocument.closeSpan();
+ rDocument.closeParagraph();
+ rDocument.closeSheetCell();
+ rDocument.closeSheetRow();
+ rDocument.closeSheet();
+ rDocument.closePageSpan();
+ rDocument.endDocument();
+}
+}
+
+namespace
+{
+class SpreadsheetImportTest : public writerperfect::test::WpftFilterFixture
+{
+public:
+ void test();
+
+ CPPUNIT_TEST_SUITE(SpreadsheetImportTest);
+ CPPUNIT_TEST(test);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+void SpreadsheetImportTest::test()
+{
+ using namespace css;
+
+ rtl::Reference<SpreadsheetImportFilter> xFilter{ new SpreadsheetImportFilter(m_xContext) };
+ writerperfect::test::WpftLoader aLoader(createDummyInput(), xFilter.get(),
+ "private:factory/scalc", m_xDesktop, m_xContext);
+
+ uno::Reference<sheet::XSpreadsheetDocument> xDoc(aLoader.getDocument(), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xDoc.is());
+ uno::Reference<container::XIndexAccess> xSheets(xDoc->getSheets(), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xSheets.is());
+ uno::Reference<table::XCellRange> xSheet(xSheets->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xSheet.is());
+ uno::Reference<table::XCell> xCell = xSheet->getCellByPosition(0, 0);
+ CPPUNIT_ASSERT(xCell.is());
+ CPPUNIT_ASSERT_EQUAL(table::CellContentType_TEXT, xCell->getType());
+ CPPUNIT_ASSERT_EQUAL(OUString("My hovercraft is full of eels."), xCell->getFormula());
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(SpreadsheetImportTest);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/qa/unit/TextImportTest.cxx b/writerperfect/qa/unit/TextImportTest.cxx
new file mode 100644
index 000000000..0b482a75c
--- /dev/null
+++ b/writerperfect/qa/unit/TextImportTest.cxx
@@ -0,0 +1,145 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/container/XEnumeration.hpp>
+#include <com/sun/star/container/XEnumerationAccess.hpp>
+#include <com/sun/star/text/XTextDocument.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+#include <cppuhelper/supportsservice.hxx>
+
+#include <rtl/ref.hxx>
+
+#include <DocumentHandlerForOdt.hxx>
+#include <ImportFilter.hxx>
+#include "WpftFilterFixture.hxx"
+#include "WpftLoader.hxx"
+#include "wpftimport.hxx"
+
+namespace
+{
+namespace uno = css::uno;
+
+class TextImportFilter : public writerperfect::ImportFilter<OdtGenerator>
+{
+public:
+ explicit TextImportFilter(const uno::Reference<uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdtGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pWindow, librevenge::RVNGInputStream& rInput,
+ OdtGenerator& rGenerator,
+ utl::MediaDescriptor& rDescriptor) override;
+
+ static void generate(librevenge::RVNGTextInterface& rDocument);
+};
+
+bool TextImportFilter::doImportDocument(weld::Window*, librevenge::RVNGInputStream&,
+ OdtGenerator& rGenerator, utl::MediaDescriptor&)
+{
+ TextImportFilter::generate(rGenerator);
+ return true;
+}
+
+bool TextImportFilter::doDetectFormat(librevenge::RVNGInputStream&, OUString& rTypeName)
+{
+ rTypeName = "WpftDummyText";
+ return true;
+}
+
+// XServiceInfo
+OUString SAL_CALL TextImportFilter::getImplementationName()
+{
+ return "org.libreoffice.comp.Wpft.QA.TextImportFilter";
+}
+
+sal_Bool SAL_CALL TextImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+uno::Sequence<OUString> SAL_CALL TextImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+void TextImportFilter::generate(librevenge::RVNGTextInterface& rDocument)
+{
+ using namespace librevenge;
+
+ rDocument.startDocument(RVNGPropertyList());
+ rDocument.openPageSpan(RVNGPropertyList());
+ rDocument.openParagraph(RVNGPropertyList());
+ rDocument.openSpan(RVNGPropertyList());
+ rDocument.insertText("My hovercraft is full of eels.");
+ rDocument.closeSpan();
+ rDocument.closeParagraph();
+ rDocument.closePageSpan();
+ rDocument.endDocument();
+}
+}
+
+namespace
+{
+class TextImportTest : public writerperfect::test::WpftFilterFixture
+{
+public:
+ void test();
+
+ CPPUNIT_TEST_SUITE(TextImportTest);
+ CPPUNIT_TEST(test);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+void TextImportTest::test()
+{
+ using namespace css;
+
+ rtl::Reference<TextImportFilter> xFilter{ new TextImportFilter(m_xContext) };
+ writerperfect::test::WpftLoader aLoader(createDummyInput(), xFilter.get(),
+ "private:factory/swriter", m_xDesktop, m_xContext);
+
+ uno::Reference<text::XTextDocument> xDoc(aLoader.getDocument(), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xDoc.is());
+ uno::Reference<container::XEnumerationAccess> xParaAccess(xDoc->getText(), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xParaAccess.is());
+ uno::Reference<container::XEnumeration> xParas = xParaAccess->createEnumeration();
+ CPPUNIT_ASSERT(xParas.is());
+ CPPUNIT_ASSERT(xParas->hasMoreElements());
+ uno::Reference<container::XEnumerationAccess> xPortionsAccess(xParas->nextElement(),
+ uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xPortionsAccess.is());
+ uno::Reference<container::XEnumeration> xPortions = xPortionsAccess->createEnumeration();
+ CPPUNIT_ASSERT(xPortions.is());
+ CPPUNIT_ASSERT(xPortions->hasMoreElements());
+ uno::Reference<beans::XPropertySet> xPortionProps(xPortions->nextElement(), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xPortionProps.is());
+ OUString aPortionType;
+ CPPUNIT_ASSERT(xPortionProps->getPropertyValue("TextPortionType") >>= aPortionType);
+ CPPUNIT_ASSERT_EQUAL(OUString("Text"), aPortionType);
+ uno::Reference<text::XTextRange> xPortion(xPortionProps, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xPortion.is());
+ CPPUNIT_ASSERT_EQUAL(OUString("My hovercraft is full of eels."), xPortion->getString());
+ CPPUNIT_ASSERT(!xPortions->hasMoreElements());
+ CPPUNIT_ASSERT(!xParas->hasMoreElements());
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(TextImportTest);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/qa/unit/WPXSvStreamTest.cxx b/writerperfect/qa/unit/WPXSvStreamTest.cxx
new file mode 100644
index 000000000..e9680510b
--- /dev/null
+++ b/writerperfect/qa/unit/WPXSvStreamTest.cxx
@@ -0,0 +1,355 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <algorithm>
+#include <cassert>
+#include <sstream>
+
+#include <memory>
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <com/sun/star/io/XInputStream.hpp>
+#include <com/sun/star/ucb/XSimpleFileAccess.hpp>
+#include <com/sun/star/uno/Reference.hxx>
+
+#include <comphelper/processfactory.hxx>
+#include <comphelper/seqstream.hxx>
+
+#include <test/bootstrapfixture.hxx>
+
+#include <WPXSvInputStream.hxx>
+
+namespace io = com::sun::star::io;
+namespace ucb = com::sun::star::ucb;
+namespace uno = com::sun::star::uno;
+
+using std::shared_ptr;
+using std::unique_ptr;
+
+using librevenge::RVNGInputStream;
+using librevenge::RVNG_SEEK_CUR;
+using librevenge::RVNG_SEEK_END;
+using librevenge::RVNG_SEEK_SET;
+
+using std::equal;
+
+using writerperfect::WPXSvInputStream;
+
+namespace
+{
+class WPXSvStreamTest : public test::BootstrapFixture
+{
+public:
+ CPPUNIT_TEST_SUITE(WPXSvStreamTest);
+ CPPUNIT_TEST(testRead);
+ CPPUNIT_TEST(testSeekSet);
+ CPPUNIT_TEST(testSeekCur);
+ CPPUNIT_TEST(testSeekEnd);
+ CPPUNIT_TEST(testStructured);
+ CPPUNIT_TEST_SUITE_END();
+
+private:
+ void testRead();
+ void testSeekSet();
+ void testSeekCur();
+ void testSeekEnd();
+ void testStructured();
+};
+
+static const char aText[] = "hello world";
+static const char aOLEFile[] = "/writerperfect/qa/unit/data/stream/fdo40686-1.doc";
+static const char aZipFile[] = "/writerperfect/qa/unit/data/stream/test.odt";
+
+shared_ptr<RVNGInputStream> lcl_createStream()
+{
+ using comphelper::SequenceInputStream;
+
+ const css::uno::Sequence<sal_Int8> aData(reinterpret_cast<const sal_Int8*>(aText),
+ sizeof aText);
+ const uno::Reference<io::XInputStream> xInputStream(new SequenceInputStream(aData));
+
+ shared_ptr<RVNGInputStream> pInputStream;
+ if (xInputStream.is())
+ pInputStream = std::make_shared<WPXSvInputStream>(xInputStream);
+
+ return pInputStream;
+}
+
+shared_ptr<RVNGInputStream> lcl_createStreamForURL(const OUString& rURL)
+{
+ using uno::Reference;
+ using uno::UNO_QUERY_THROW;
+
+ const Reference<uno::XComponentContext> xContext(comphelper::getProcessComponentContext(),
+ css::uno::UNO_SET_THROW);
+ const Reference<ucb::XSimpleFileAccess> xFileAccess(
+ xContext->getServiceManager()->createInstanceWithContext(
+ "com.sun.star.ucb.SimpleFileAccess", xContext),
+ UNO_QUERY_THROW);
+ const Reference<io::XInputStream> xInputStream(xFileAccess->openFileRead(rURL),
+ css::uno::UNO_SET_THROW);
+
+ return std::make_shared<WPXSvInputStream>(xInputStream);
+}
+
+void lcl_testSubStreams(const shared_ptr<RVNGInputStream>& pInput)
+{
+ shared_ptr<RVNGInputStream> pSubStream;
+
+ // all valid substreams can be read
+ for (std::size_t i = 0; i != pInput->subStreamCount(); ++i)
+ {
+ std::ostringstream msg("opening substream ");
+ msg << i;
+ pSubStream.reset(pInput->getSubStreamById(i));
+ CPPUNIT_ASSERT_MESSAGE(msg.str(), bool(pSubStream));
+ }
+
+ // invalid substreams cannot be read
+ pSubStream.reset(pInput->getSubStreamById(pInput->subStreamCount()));
+ CPPUNIT_ASSERT(!pSubStream);
+}
+
+void WPXSvStreamTest::testRead()
+{
+ const shared_ptr<RVNGInputStream> pInput(lcl_createStream());
+ const unsigned long nLen = sizeof aText;
+
+ unsigned long nReadBytes = 0;
+ const unsigned char* pData = nullptr;
+ const unsigned char* const pTextOrig = reinterpret_cast<const unsigned char*>(aText);
+ const unsigned char* pText = pTextOrig;
+
+ // reading by small pieces
+ pData = pInput->read(1UL, nReadBytes);
+ CPPUNIT_ASSERT_EQUAL(1UL, nReadBytes);
+ CPPUNIT_ASSERT(equal(pText, pText + nReadBytes, pData));
+ CPPUNIT_ASSERT(!pInput->isEnd());
+ pText += nReadBytes;
+
+ pData = pInput->read(2UL, nReadBytes);
+ CPPUNIT_ASSERT_EQUAL(2UL, nReadBytes);
+ CPPUNIT_ASSERT(equal(pText, pText + nReadBytes, pData));
+ CPPUNIT_ASSERT(!pInput->isEnd());
+ pText += nReadBytes;
+
+ pData = pInput->read(3UL, nReadBytes);
+ CPPUNIT_ASSERT_EQUAL(3UL, nReadBytes);
+ CPPUNIT_ASSERT(equal(pText, pText + nReadBytes, pData));
+ CPPUNIT_ASSERT(!pInput->isEnd());
+ pText += nReadBytes;
+
+ assert(nLen > 6);
+ pData = pInput->read(nLen - 6, nReadBytes);
+ CPPUNIT_ASSERT_EQUAL(nLen - 6, nReadBytes);
+ CPPUNIT_ASSERT(equal(pText, pText + nReadBytes, pData));
+ CPPUNIT_ASSERT(pInput->isEnd());
+
+ // reading everything at once
+ pInput->seek(0, RVNG_SEEK_SET);
+ pText = pTextOrig;
+
+ pData = pInput->read(nLen, nReadBytes);
+ CPPUNIT_ASSERT_EQUAL(nLen, nReadBytes);
+ CPPUNIT_ASSERT(equal(pText, pText + nReadBytes, pData));
+ CPPUNIT_ASSERT(pInput->isEnd());
+
+ // trying to read too much
+ pInput->seek(0, RVNG_SEEK_SET);
+ pText = pTextOrig;
+
+ pData = pInput->read(nLen + 1, nReadBytes);
+ CPPUNIT_ASSERT_EQUAL(nLen, nReadBytes);
+ CPPUNIT_ASSERT(equal(pText, pText + nReadBytes, pData));
+ CPPUNIT_ASSERT(pInput->isEnd());
+
+ // trying to read nothing
+ pInput->seek(0, RVNG_SEEK_SET);
+ pData = pInput->read(0UL, nReadBytes);
+ CPPUNIT_ASSERT_EQUAL(0UL, nReadBytes);
+ CPPUNIT_ASSERT_EQUAL(0L, pInput->tell());
+ CPPUNIT_ASSERT_EQUAL(pData, static_cast<const unsigned char*>(nullptr));
+ CPPUNIT_ASSERT(!pInput->isEnd());
+}
+
+void WPXSvStreamTest::testSeekSet()
+{
+ const shared_ptr<RVNGInputStream> pInput(lcl_createStream());
+ const long nLen = sizeof aText;
+
+ // check initial state
+ CPPUNIT_ASSERT_EQUAL(0L, pInput->tell());
+ CPPUNIT_ASSERT(!pInput->isEnd());
+
+ // valid seeks
+ CPPUNIT_ASSERT_EQUAL(0, pInput->seek(0, RVNG_SEEK_SET));
+ CPPUNIT_ASSERT_EQUAL(0L, pInput->tell());
+ CPPUNIT_ASSERT(!pInput->isEnd());
+
+ CPPUNIT_ASSERT_EQUAL(0, pInput->seek(1, RVNG_SEEK_SET));
+ CPPUNIT_ASSERT_EQUAL(1L, pInput->tell());
+ CPPUNIT_ASSERT(!pInput->isEnd());
+
+ CPPUNIT_ASSERT_EQUAL(0, pInput->seek(nLen, RVNG_SEEK_SET));
+ CPPUNIT_ASSERT_EQUAL(nLen, pInput->tell());
+ CPPUNIT_ASSERT(pInput->isEnd());
+
+ // go back to the beginning
+ CPPUNIT_ASSERT_EQUAL(0, pInput->seek(0, RVNG_SEEK_SET));
+ CPPUNIT_ASSERT_EQUAL(0L, pInput->tell());
+
+ // invalid seeks
+ CPPUNIT_ASSERT(0 != pInput->seek(-1, RVNG_SEEK_SET));
+ // Okay, this is not defined. But it is what the WPXSvInputStream
+ // does ATM and it is reasonable.
+ CPPUNIT_ASSERT_EQUAL(0L, pInput->tell());
+ CPPUNIT_ASSERT(!pInput->isEnd());
+
+ CPPUNIT_ASSERT(0 != pInput->seek(nLen + 1, RVNG_SEEK_SET));
+ CPPUNIT_ASSERT_EQUAL(nLen, pInput->tell());
+ CPPUNIT_ASSERT(pInput->isEnd());
+}
+
+void WPXSvStreamTest::testSeekCur()
+{
+ const shared_ptr<RVNGInputStream> pInput(lcl_createStream());
+ const long nLen = sizeof aText;
+
+ // check initial state
+ CPPUNIT_ASSERT(!pInput->isEnd());
+ CPPUNIT_ASSERT_EQUAL(0L, pInput->tell());
+
+ // valid seeks
+
+ CPPUNIT_ASSERT_EQUAL(0, pInput->seek(0, RVNG_SEEK_CUR));
+ CPPUNIT_ASSERT_EQUAL(0L, pInput->tell());
+ CPPUNIT_ASSERT(!pInput->isEnd());
+
+ CPPUNIT_ASSERT_EQUAL(0, pInput->seek(1, RVNG_SEEK_CUR));
+ CPPUNIT_ASSERT_EQUAL(1L, pInput->tell());
+ CPPUNIT_ASSERT(!pInput->isEnd());
+
+ CPPUNIT_ASSERT_EQUAL(0, pInput->seek(-1, RVNG_SEEK_CUR));
+ CPPUNIT_ASSERT_EQUAL(0L, pInput->tell());
+ CPPUNIT_ASSERT(!pInput->isEnd());
+
+ // go back to the beginning
+ CPPUNIT_ASSERT_EQUAL(0, pInput->seek(0, RVNG_SEEK_SET));
+ CPPUNIT_ASSERT_EQUAL(0L, pInput->tell());
+
+ // invalid seeks
+ CPPUNIT_ASSERT(0 != pInput->seek(-1, RVNG_SEEK_CUR));
+ CPPUNIT_ASSERT_EQUAL(0L, pInput->tell());
+ CPPUNIT_ASSERT(!pInput->isEnd());
+
+ CPPUNIT_ASSERT(0 != pInput->seek(nLen + 1, RVNG_SEEK_CUR));
+ CPPUNIT_ASSERT_EQUAL(nLen, pInput->tell());
+ CPPUNIT_ASSERT(pInput->isEnd());
+}
+
+void WPXSvStreamTest::testSeekEnd()
+{
+ const shared_ptr<RVNGInputStream> pInput(lcl_createStream());
+ const long nLen = sizeof aText;
+
+ // check initial state
+ CPPUNIT_ASSERT(!pInput->isEnd());
+ CPPUNIT_ASSERT_EQUAL(0L, pInput->tell());
+
+ // valid seeks
+ CPPUNIT_ASSERT_EQUAL(0, pInput->seek(0, RVNG_SEEK_END));
+ CPPUNIT_ASSERT_EQUAL(nLen, pInput->tell());
+ CPPUNIT_ASSERT(pInput->isEnd());
+
+ CPPUNIT_ASSERT_EQUAL(0, pInput->seek(-1, RVNG_SEEK_END));
+ CPPUNIT_ASSERT_EQUAL(nLen - 1, pInput->tell());
+ CPPUNIT_ASSERT(!pInput->isEnd());
+
+ CPPUNIT_ASSERT_EQUAL(0, pInput->seek(-nLen, RVNG_SEEK_END));
+ CPPUNIT_ASSERT_EQUAL(0L, pInput->tell());
+ CPPUNIT_ASSERT(!pInput->isEnd());
+
+ // go back to the beginning
+ CPPUNIT_ASSERT_EQUAL(0, pInput->seek(0, RVNG_SEEK_SET));
+ CPPUNIT_ASSERT_EQUAL(0L, pInput->tell());
+
+ // invalid seeks
+ CPPUNIT_ASSERT(0 != pInput->seek(1, RVNG_SEEK_END));
+ CPPUNIT_ASSERT_EQUAL(nLen, pInput->tell());
+ CPPUNIT_ASSERT(pInput->isEnd());
+
+ CPPUNIT_ASSERT(0 != pInput->seek(-nLen - 1, RVNG_SEEK_END));
+ CPPUNIT_ASSERT_EQUAL(0L, pInput->tell());
+ CPPUNIT_ASSERT(!pInput->isEnd());
+}
+
+void WPXSvStreamTest::testStructured()
+{
+ // OLE2
+ {
+ const shared_ptr<RVNGInputStream> pInput(
+ lcl_createStreamForURL(m_directories.getURLFromSrc(aOLEFile)));
+ assert(bool(pInput));
+
+ CPPUNIT_ASSERT(pInput->isStructured());
+ CPPUNIT_ASSERT_EQUAL(static_cast<unsigned>(2), pInput->subStreamCount());
+ lcl_testSubStreams(pInput);
+
+ // check for existing substream
+ CPPUNIT_ASSERT(pInput->existsSubStream("WordDocument"));
+ unique_ptr<RVNGInputStream> pSubStream(pInput->getSubStreamByName("WordDocument"));
+ CPPUNIT_ASSERT(bool(pSubStream));
+ CPPUNIT_ASSERT(!pSubStream->isEnd());
+
+ // check for not existing substream
+ CPPUNIT_ASSERT(!pInput->existsSubStream("foo"));
+ pSubStream.reset(pInput->getSubStreamByName("foo"));
+ CPPUNIT_ASSERT(!pSubStream);
+ }
+
+ // Zip
+ {
+ const shared_ptr<RVNGInputStream> pInput(
+ lcl_createStreamForURL(m_directories.getURLFromSrc(aZipFile)));
+ assert(bool(pInput));
+
+ CPPUNIT_ASSERT(pInput->isStructured());
+ CPPUNIT_ASSERT_EQUAL(static_cast<unsigned>(9), pInput->subStreamCount());
+ lcl_testSubStreams(pInput);
+
+ // check for existing substream
+ CPPUNIT_ASSERT(pInput->existsSubStream("content.xml"));
+ unique_ptr<RVNGInputStream> pSubStream(pInput->getSubStreamByName("content.xml"));
+ CPPUNIT_ASSERT(bool(pSubStream));
+ CPPUNIT_ASSERT(!pSubStream->isEnd());
+
+ // check for not existing substream
+ CPPUNIT_ASSERT(!pInput->existsSubStream("foo"));
+ pSubStream.reset(pInput->getSubStreamByName("foo"));
+ CPPUNIT_ASSERT(!pSubStream);
+ }
+
+ // not structured
+ {
+ const shared_ptr<RVNGInputStream> pInput(lcl_createStream());
+
+ CPPUNIT_ASSERT(!pInput->isStructured());
+ CPPUNIT_ASSERT_EQUAL(static_cast<unsigned>(0), pInput->subStreamCount());
+ CPPUNIT_ASSERT(!pInput->existsSubStream("foo"));
+ CPPUNIT_ASSERT(!pInput->getSubStreamByName("foo"));
+ CPPUNIT_ASSERT(!pInput->getSubStreamById(42));
+ CPPUNIT_ASSERT(!pInput->subStreamName(42));
+ }
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(WPXSvStreamTest);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/qa/unit/WpftCalcFilterTest.cxx b/writerperfect/qa/unit/WpftCalcFilterTest.cxx
new file mode 100644
index 000000000..d31075733
--- /dev/null
+++ b/writerperfect/qa/unit/WpftCalcFilterTest.cxx
@@ -0,0 +1,61 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "WpftFilterTestBase.hxx"
+
+namespace
+{
+class WpftCalcFilterTest : public writerperfect::test::WpftFilterTestBase
+{
+public:
+ WpftCalcFilterTest();
+
+ void test();
+
+ CPPUNIT_TEST_SUITE(WpftCalcFilterTest);
+ CPPUNIT_TEST(test);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+WpftCalcFilterTest::WpftCalcFilterTest()
+ : writerperfect::test::WpftFilterTestBase("private:factory/scalc")
+{
+}
+
+void WpftCalcFilterTest::test()
+{
+ const writerperfect::test::WpftOptionalMap_t aEtonyekOptional{
+ { "Numbers_2.numbers", REQUIRE_ETONYEK_VERSION(0, 1, 2) },
+ };
+ const writerperfect::test::WpftOptionalMap_t aMWAWOptional{
+ { "Multiplan_1.hqx", REQUIRE_MWAW_VERSION(0, 3, 14) },
+ };
+ const writerperfect::test::WpftOptionalMap_t aWpsOptional{
+ { "Lotus123_3.123", REQUIRE_WPS_VERSION(0, 4, 5) },
+ { "Lotus123_98.123", REQUIRE_WPS_VERSION(0, 4, 6) },
+ { "Multiplan_3", REQUIRE_WPS_VERSION(0, 4, 9) },
+ { "QuattroPro.wb1", REQUIRE_WPS_VERSION(0, 4, 8) },
+ };
+
+ doTest("com.sun.star.comp.Calc.MWAWCalcImportFilter",
+ "/writerperfect/qa/unit/data/calc/libmwaw/", aMWAWOptional);
+ doTest("com.sun.star.comp.Calc.MSWorksCalcImportFilter",
+ "/writerperfect/qa/unit/data/calc/libwps/", aWpsOptional);
+ doTest("org.libreoffice.comp.Calc.NumbersImportFilter",
+ "/writerperfect/qa/unit/data/calc/libetonyek/", aEtonyekOptional);
+ doTest("org.libreoffice.comp.Calc.StarOfficeCalcImportFilter",
+ "/writerperfect/qa/unit/data/calc/libstaroffice/");
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(WpftCalcFilterTest);
+}
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/qa/unit/WpftDrawFilterTest.cxx b/writerperfect/qa/unit/WpftDrawFilterTest.cxx
new file mode 100644
index 000000000..ddb5be888
--- /dev/null
+++ b/writerperfect/qa/unit/WpftDrawFilterTest.cxx
@@ -0,0 +1,76 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "WpftFilterTestBase.hxx"
+
+namespace
+{
+class WpftDrawFilterTest : public writerperfect::test::WpftFilterTestBase
+{
+public:
+ WpftDrawFilterTest();
+
+ void test();
+
+ CPPUNIT_TEST_SUITE(WpftDrawFilterTest);
+ CPPUNIT_TEST(test);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+WpftDrawFilterTest::WpftDrawFilterTest()
+ : writerperfect::test::WpftFilterTestBase("private:factory/sdraw")
+{
+}
+
+void WpftDrawFilterTest::test()
+{
+ const writerperfect::test::WpftOptionalMap_t aMWAWOptional{
+ { "ClarisDraw.hqx", REQUIRE_MWAW_VERSION(0, 3, 5) },
+ { "CorelPainter_3_win.rif", REQUIRE_MWAW_VERSION(0, 3, 15) },
+ { "CorelPainter_10", REQUIRE_MWAW_VERSION(0, 3, 15) },
+ { "CricketDraw_1.0.hqx", REQUIRE_MWAW_VERSION(0, 3, 8) },
+ { "CricketDraw_1.1.hqx", REQUIRE_MWAW_VERSION(0, 3, 8) },
+ { "FreeHand_1.0.hqx", REQUIRE_MWAW_VERSION(0, 3, 8) },
+ { "FreeHand_2.0.hqx", REQUIRE_MWAW_VERSION(0, 3, 8) },
+ { "MacDraft_1.0.hqx", REQUIRE_MWAW_VERSION(0, 3, 5) },
+ { "MacDraft_5.5.drw", REQUIRE_MWAW_VERSION(0, 3, 6) },
+ { "MacDraw_0.hqx", REQUIRE_MWAW_VERSION(0, 3, 2) },
+ { "MacDraw_1.hqx", REQUIRE_MWAW_VERSION(0, 3, 2) },
+ { "MacDraw_II.hqx", REQUIRE_MWAW_VERSION(0, 3, 3) },
+ { "MacDraw_Pro_1.0.hqx", REQUIRE_MWAW_VERSION(0, 3, 4) },
+ };
+ const writerperfect::test::WpftOptionalMap_t aStarOfficeOptional{
+ { "Draw_3.1.sda", REQUIRE_STAROFFICE_VERSION(0, 0, 1) },
+ };
+
+ doTest("com.sun.star.comp.Draw.CDRImportFilter", "/writerperfect/qa/unit/data/draw/libcdr/");
+ doTest("com.sun.star.comp.Draw.CMXImportFilter",
+ "/writerperfect/qa/unit/data/draw/libcdr-cmx/");
+ doTest("com.sun.star.comp.Draw.FreehandImportFilter",
+ "/writerperfect/qa/unit/data/draw/libfreehand/");
+ doTest("com.sun.star.comp.Draw.MSPUBImportFilter",
+ "/writerperfect/qa/unit/data/draw/libmspub/");
+ doTest("com.sun.star.comp.Draw.MWAWDrawImportFilter",
+ "/writerperfect/qa/unit/data/draw/libmwaw/", aMWAWOptional);
+ doTest("com.sun.star.comp.Draw.VisioImportFilter",
+ "/writerperfect/qa/unit/data/draw/libvisio/");
+ doTest("com.sun.star.comp.Draw.WPGImportFilter", "/writerperfect/qa/unit/data/draw/libwpg/");
+ doTest("org.libreoffice.comp.Draw.PageMakerImportFilter",
+ "/writerperfect/qa/unit/data/draw/libpagemaker/");
+ doTest("org.libreoffice.comp.Draw.StarOfficeDrawImportFilter",
+ "/writerperfect/qa/unit/data/draw/libstaroffice/", aStarOfficeOptional);
+ doTest("org.libreoffice.comp.Draw.ZMFImportFilter", "/writerperfect/qa/unit/data/draw/libzmf/");
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(WpftDrawFilterTest);
+}
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/qa/unit/WpftFilterFixture.cxx b/writerperfect/qa/unit/WpftFilterFixture.cxx
new file mode 100644
index 000000000..142ff22c3
--- /dev/null
+++ b/writerperfect/qa/unit/WpftFilterFixture.cxx
@@ -0,0 +1,35 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "WpftFilterFixture.hxx"
+
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/document/XTypeDetection.hpp>
+#include <com/sun/star/frame/theDesktop.hpp>
+
+namespace document = com::sun::star::document;
+namespace frame = com::sun::star::frame;
+namespace uno = com::sun::star::uno;
+
+namespace writerperfect::test
+{
+void WpftFilterFixture::setUp()
+{
+ ::test::BootstrapFixture::setUp();
+
+ m_xDesktop = frame::theDesktop::get(m_xContext);
+
+ m_xTypeDetection.set(
+ m_xFactory->createInstanceWithContext("com.sun.star.document.TypeDetection", m_xContext),
+ uno::UNO_QUERY_THROW);
+ m_xTypeMap.set(m_xTypeDetection, uno::UNO_QUERY_THROW);
+}
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/qa/unit/WpftFilterFixture.hxx b/writerperfect/qa/unit/WpftFilterFixture.hxx
new file mode 100644
index 000000000..f32478165
--- /dev/null
+++ b/writerperfect/qa/unit/WpftFilterFixture.hxx
@@ -0,0 +1,88 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_QA_UNIT_WPFTFILTERFIXTURE_HXX
+#define INCLUDED_WRITERPERFECT_QA_UNIT_WPFTFILTERFIXTURE_HXX
+
+#include <config_writerperfect.h>
+
+#include "wpftqahelperdllapi.h"
+
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/uno/Sequence.hxx>
+
+#include <rtl/ustring.hxx>
+
+#include <test/bootstrapfixture.hxx>
+
+#define REQUIRE_VERSION(major, minor, micro, req_major, req_minor, req_micro) \
+ (major) > (req_major) \
+ || ((major) == (req_major) \
+ && ((minor) > (req_minor) || ((minor) == (req_minor) && ((micro) >= (req_micro)))))
+
+#define REQUIRE_EBOOK_VERSION(major, minor, micro) \
+ REQUIRE_VERSION(EBOOK_VERSION_MAJOR, EBOOK_VERSION_MINOR, EBOOK_VERSION_MICRO, major, minor, \
+ micro)
+
+#define REQUIRE_ETONYEK_VERSION(major, minor, micro) \
+ REQUIRE_VERSION(ETONYEK_VERSION_MAJOR, ETONYEK_VERSION_MINOR, ETONYEK_VERSION_MICRO, major, \
+ minor, micro)
+
+#define REQUIRE_MWAW_VERSION(major, minor, micro) \
+ REQUIRE_VERSION(MWAW_VERSION_MAJOR, MWAW_VERSION_MINOR, MWAW_VERSION_MICRO, major, minor, micro)
+
+#define REQUIRE_STAROFFICE_VERSION(major, minor, micro) \
+ REQUIRE_VERSION(STAROFFICE_VERSION_MAJOR, STAROFFICE_VERSION_MINOR, STAROFFICE_VERSION_MICRO, \
+ major, minor, micro)
+
+#define REQUIRE_WPS_VERSION(major, minor, micro) \
+ REQUIRE_VERSION(WPS_VERSION_MAJOR, WPS_VERSION_MINOR, WPS_VERSION_MICRO, major, minor, micro)
+
+namespace com
+{
+namespace sun
+{
+namespace star
+{
+namespace container
+{
+class XNameAccess;
+}
+namespace document
+{
+class XTypeDetection;
+}
+namespace frame
+{
+class XDesktop2;
+}
+}
+}
+}
+
+namespace writerperfect
+{
+namespace test
+{
+class WPFTQAHELPER_DLLPUBLIC WpftFilterFixture : public ::test::BootstrapFixture
+{
+public:
+ virtual void setUp() override;
+
+protected:
+ css::uno::Reference<css::frame::XDesktop2> m_xDesktop;
+ css::uno::Reference<css::document::XTypeDetection> m_xTypeDetection;
+ css::uno::Reference<css::container::XNameAccess> m_xTypeMap;
+};
+}
+}
+
+#endif // INCLUDED_WRITERPERFECT_QA_UNIT_WPFTFILTERFIXTURE_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/qa/unit/WpftFilterTestBase.cxx b/writerperfect/qa/unit/WpftFilterTestBase.cxx
new file mode 100644
index 000000000..1c5989c79
--- /dev/null
+++ b/writerperfect/qa/unit/WpftFilterTestBase.cxx
@@ -0,0 +1,62 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "WpftFilterTestBase.hxx"
+
+#include <com/sun/star/document/XFilter.hpp>
+
+#include <tools/urlobj.hxx>
+
+#include "WpftLoader.hxx"
+
+namespace uno = com::sun::star::uno;
+
+namespace writerperfect::test
+{
+WpftFilterTestBase::WpftFilterTestBase(const OUString& rFactoryURL)
+ : ::test::FiltersTest()
+ , WpftFilterFixture()
+ , m_aFactoryURL(rFactoryURL)
+ , m_pOptionalMap(nullptr)
+{
+}
+
+bool WpftFilterTestBase::load(const OUString&, const OUString& rURL, const OUString&,
+ SfxFilterFlags, SotClipboardFormatId, unsigned int)
+{
+ if (m_pOptionalMap)
+ {
+ // first check if this test file is supported by the used version of the library
+ const INetURLObject aUrl(rURL);
+ const WpftOptionalMap_t::const_iterator it(m_pOptionalMap->find(aUrl.getName()));
+ if ((it != m_pOptionalMap->end()) && !it->second)
+ return true; // skip the file
+ }
+
+ const WpftLoader aLoader(rURL, m_xFilter, m_aFactoryURL, m_xDesktop, m_xTypeMap, m_xContext);
+ return aLoader.getDocument().is();
+}
+
+void WpftFilterTestBase::doTest(const OUString& rFilter, const OUString& rPath)
+{
+ m_xFilter.set(m_xFactory->createInstanceWithContext(rFilter, m_xContext), uno::UNO_QUERY_THROW);
+ testDir(OUString(), m_directories.getURLFromSrc(rPath));
+}
+
+void WpftFilterTestBase::doTest(const OUString& rFilter, const OUString& rPath,
+ const WpftOptionalMap_t& rOptionalMap)
+{
+ m_xFilter.set(m_xFactory->createInstanceWithContext(rFilter, m_xContext), uno::UNO_QUERY_THROW);
+ m_pOptionalMap = &rOptionalMap;
+ testDir(OUString(), m_directories.getURLFromSrc(rPath));
+ m_pOptionalMap = nullptr;
+}
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/qa/unit/WpftFilterTestBase.hxx b/writerperfect/qa/unit/WpftFilterTestBase.hxx
new file mode 100644
index 000000000..509ebcb6d
--- /dev/null
+++ b/writerperfect/qa/unit/WpftFilterTestBase.hxx
@@ -0,0 +1,70 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_QA_UNIT_WPFTFILTERTESTBASE_HXX
+#define INCLUDED_WRITERPERFECT_QA_UNIT_WPFTFILTERTESTBASE_HXX
+
+#include "wpftqahelperdllapi.h"
+
+#include <unordered_map>
+
+#include <com/sun/star/uno/Reference.hxx>
+
+#include <rtl/ustring.hxx>
+
+#include <unotest/filters-test.hxx>
+
+#include "WpftFilterFixture.hxx"
+
+namespace com
+{
+namespace sun
+{
+namespace star
+{
+namespace document
+{
+class XFilter;
+}
+}
+}
+}
+
+namespace writerperfect
+{
+namespace test
+{
+typedef std::unordered_map<OUString, bool> WpftOptionalMap_t;
+
+class WPFTQAHELPER_DLLPUBLIC WpftFilterTestBase : public ::test::FiltersTest,
+ public WpftFilterFixture
+{
+public:
+ explicit WpftFilterTestBase(const OUString& rFactoryURL);
+
+protected:
+ void doTest(const OUString& rFilter, const OUString& rPath);
+ void doTest(const OUString& rFilter, const OUString& rPath,
+ const WpftOptionalMap_t& rOptionalMap);
+
+private:
+ virtual bool load(const OUString&, const OUString& rURL, const OUString&, SfxFilterFlags,
+ SotClipboardFormatId, unsigned int) override;
+
+private:
+ const OUString m_aFactoryURL;
+ css::uno::Reference<css::document::XFilter> m_xFilter;
+ const WpftOptionalMap_t* m_pOptionalMap;
+};
+}
+}
+
+#endif // INCLUDED_WRITERPERFECT_QA_UNIT_WPFTFILTERTESTBASE_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/qa/unit/WpftImpressFilterTest.cxx b/writerperfect/qa/unit/WpftImpressFilterTest.cxx
new file mode 100644
index 000000000..f6f7608f7
--- /dev/null
+++ b/writerperfect/qa/unit/WpftImpressFilterTest.cxx
@@ -0,0 +1,62 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "WpftFilterTestBase.hxx"
+
+namespace
+{
+class WpftImpressFilterTest : public writerperfect::test::WpftFilterTestBase
+{
+public:
+ WpftImpressFilterTest();
+
+ void test();
+
+ CPPUNIT_TEST_SUITE(WpftImpressFilterTest);
+ CPPUNIT_TEST(test);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+WpftImpressFilterTest::WpftImpressFilterTest()
+ : writerperfect::test::WpftFilterTestBase("private:factory/simpress")
+{
+}
+
+void WpftImpressFilterTest::test()
+{
+ const writerperfect::test::WpftOptionalMap_t aEtonyekOptional{
+ { "Keynote_1.key", REQUIRE_ETONYEK_VERSION(0, 1, 8) },
+ { "Keynote_2.key", REQUIRE_ETONYEK_VERSION(0, 1, 1) },
+ { "Keynote_3.key", REQUIRE_ETONYEK_VERSION(0, 1, 1) },
+ { "Keynote_6.key", REQUIRE_ETONYEK_VERSION(0, 1, 4) },
+ };
+ const writerperfect::test::WpftOptionalMap_t aMWAWOptional{
+ { "ClarisWorks_6.0.cwk", REQUIRE_MWAW_VERSION(0, 3, 3) },
+ { "PowerPoint_Mac_1", REQUIRE_MWAW_VERSION(0, 3, 9) },
+ { "PowerPoint_Mac_2", REQUIRE_MWAW_VERSION(0, 3, 9) },
+ { "PowerPoint_Mac_3", REQUIRE_MWAW_VERSION(0, 3, 9) },
+ { "PowerPoint_Mac_4.ppt", REQUIRE_MWAW_VERSION(0, 3, 10) },
+ { "PowerPoint_2.ppt", REQUIRE_MWAW_VERSION(0, 3, 10) },
+ { "PowerPoint_3.ppt", REQUIRE_MWAW_VERSION(0, 3, 9) },
+ { "PowerPoint_4.ppt", REQUIRE_MWAW_VERSION(0, 3, 10) },
+ { "PowerPoint_7.ppt", REQUIRE_MWAW_VERSION(0, 3, 11) },
+ };
+
+ doTest("org.libreoffice.comp.Impress.KeynoteImportFilter",
+ "/writerperfect/qa/unit/data/impress/libetonyek/", aEtonyekOptional);
+ doTest("com.sun.star.comp.Impress.MWAWPresentationImportFilter",
+ "/writerperfect/qa/unit/data/impress/libmwaw/", aMWAWOptional);
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(WpftImpressFilterTest);
+}
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/qa/unit/WpftLoader.cxx b/writerperfect/qa/unit/WpftLoader.cxx
new file mode 100644
index 000000000..3338e72c3
--- /dev/null
+++ b/writerperfect/qa/unit/WpftLoader.cxx
@@ -0,0 +1,208 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "WpftLoader.hxx"
+
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/container/NoSuchElementException.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/document/XExtendedFilterDetection.hpp>
+#include <com/sun/star/document/XFilter.hpp>
+#include <com/sun/star/document/XImporter.hpp>
+#include <com/sun/star/frame/XController.hpp>
+#include <com/sun/star/frame/XDesktop2.hpp>
+#include <com/sun/star/frame/XModel.hpp>
+#include <com/sun/star/io/XInputStream.hpp>
+#include <com/sun/star/lang/IllegalArgumentException.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/ucb/XCommandEnvironment.hpp>
+#include <com/sun/star/ucb/XContent.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/util/XCloseable.hpp>
+
+#include <ucbhelper/content.hxx>
+
+namespace beans = com::sun::star::beans;
+namespace container = com::sun::star::container;
+namespace document = com::sun::star::document;
+namespace frame = com::sun::star::frame;
+namespace lang = com::sun::star::lang;
+namespace ucb = com::sun::star::ucb;
+namespace uno = com::sun::star::uno;
+namespace util = com::sun::star::util;
+
+namespace writerperfect::test
+{
+WpftLoader::WpftLoader(const OUString& rURL,
+ const css::uno::Reference<css::document::XFilter>& rxFilter,
+ const OUString& rFactoryURL,
+ const css::uno::Reference<css::frame::XDesktop2>& rxDesktop,
+ const css::uno::Reference<css::container::XNameAccess>& rxTypeMap,
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : m_aURL(rURL)
+ , m_aFactoryURL(rFactoryURL)
+ , m_xFilter(rxFilter)
+ , m_xDesktop(rxDesktop)
+ , m_xTypeMap(rxTypeMap)
+ , m_xContext(rxContext)
+{
+ if (!impl_load())
+ impl_dispose();
+}
+
+WpftLoader::WpftLoader(const css::uno::Reference<css::io::XInputStream>& rxInputStream,
+ const css::uno::Reference<css::document::XFilter>& rxFilter,
+ const OUString& rFactoryURL,
+ const css::uno::Reference<css::frame::XDesktop2>& rxDesktop,
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : m_xInputStream(rxInputStream)
+ , m_aFactoryURL(rFactoryURL)
+ , m_xFilter(rxFilter)
+ , m_xDesktop(rxDesktop)
+ , m_xContext(rxContext)
+{
+ if (!impl_load())
+ impl_dispose();
+}
+
+WpftLoader::~WpftLoader()
+{
+ try
+ {
+ impl_dispose();
+ }
+ catch (...)
+ {
+ }
+}
+
+const css::uno::Reference<css::lang::XComponent>& WpftLoader::getDocument() const { return m_xDoc; }
+
+bool WpftLoader::impl_load()
+{
+ // create an empty frame
+ m_xDoc.set(m_xDesktop->loadComponentFromURL(m_aFactoryURL, "_blank", 0,
+ uno::Sequence<beans::PropertyValue>()),
+ uno::UNO_SET_THROW);
+
+ // Find the model and frame. We need them later.
+ m_xFrame.set(m_xDoc, uno::UNO_QUERY);
+ uno::Reference<frame::XModel> xModel(m_xDoc, uno::UNO_QUERY);
+ uno::Reference<frame::XController> xController(m_xDoc, uno::UNO_QUERY);
+
+ if (m_xFrame.is())
+ {
+ xController = m_xFrame->getController();
+ xModel = xController->getModel();
+ }
+ else if (xModel.is())
+ {
+ xController = xModel->getCurrentController();
+ m_xFrame = xController->getFrame();
+ }
+ else if (xController.is())
+ {
+ m_xFrame = xController->getFrame();
+ xModel = xController->getModel();
+ }
+
+ if (!m_xFrame.is() || !xModel.is())
+ throw uno::RuntimeException();
+
+ // try to import the document (and load it into the prepared frame)
+ try
+ {
+ const uno::Reference<document::XImporter> xImporter(m_xFilter, uno::UNO_QUERY_THROW);
+
+ xImporter->setTargetDocument(m_xDoc);
+
+ uno::Sequence<beans::PropertyValue> aDescriptor(3);
+ aDescriptor[0].Name = "URL";
+ aDescriptor[0].Value <<= m_aURL;
+ if (m_xInputStream.is())
+ {
+ aDescriptor[1].Name = "InputStream";
+ aDescriptor[1].Value <<= m_xInputStream;
+ }
+ else
+ {
+ ucbhelper::Content aContent(m_aURL, uno::Reference<ucb::XCommandEnvironment>(),
+ m_xContext);
+ aDescriptor[1].Name = "InputStream";
+ aDescriptor[1].Value <<= aContent.openStream();
+ aDescriptor[2].Name = "UCBContent";
+ aDescriptor[2].Value <<= aContent.get();
+ }
+
+ const uno::Reference<document::XExtendedFilterDetection> xDetector(m_xFilter,
+ uno::UNO_QUERY_THROW);
+
+ const OUString aTypeName(xDetector->detect(aDescriptor));
+ if (aTypeName.isEmpty())
+ throw lang::IllegalArgumentException();
+
+ if (m_xTypeMap.is())
+ impl_detectFilterName(aDescriptor, aTypeName);
+
+ xModel->lockControllers();
+ const bool bLoaded = m_xFilter->filter(aDescriptor);
+ xModel->unlockControllers();
+ return bLoaded;
+ }
+ catch (const uno::Exception&)
+ {
+ // ignore
+ }
+
+ return false;
+}
+
+void WpftLoader::impl_dispose()
+{
+ // close the opened document
+ uno::Reference<util::XCloseable> xCloseable(m_xFrame, uno::UNO_QUERY);
+ if (xCloseable.is())
+ xCloseable->close(true);
+ else if (m_xDoc.is())
+ m_xDoc->dispose();
+ m_xDoc.clear();
+ m_xFrame.clear();
+}
+
+void WpftLoader::impl_detectFilterName(uno::Sequence<beans::PropertyValue>& rDescriptor,
+ const OUString& rTypeName)
+{
+ bool bHasFilterName
+ = std::any_of(rDescriptor.begin(), rDescriptor.end(),
+ [](const beans::PropertyValue& rProp) { return "FilterName" == rProp.Name; });
+ if (bHasFilterName)
+ return;
+
+ uno::Sequence<beans::PropertyValue> aTypes;
+ if (m_xTypeMap->getByName(rTypeName) >>= aTypes)
+ {
+ for (const auto& rType : std::as_const(aTypes))
+ {
+ OUString aFilterName;
+ if (("PreferredFilter" == rType.Name) && (rType.Value >>= aFilterName))
+ {
+ const sal_Int32 nDescriptorLen = rDescriptor.getLength();
+ rDescriptor.realloc(nDescriptorLen + 1);
+ rDescriptor[nDescriptorLen].Name = "FilterName";
+ rDescriptor[nDescriptorLen].Value <<= aFilterName;
+ return;
+ }
+ }
+ }
+
+ throw container::NoSuchElementException();
+}
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/qa/unit/WpftLoader.hxx b/writerperfect/qa/unit/WpftLoader.hxx
new file mode 100644
index 000000000..ccd8f9294
--- /dev/null
+++ b/writerperfect/qa/unit/WpftLoader.hxx
@@ -0,0 +1,103 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_QA_UNIT_WPFTLOADER_HXX
+#define INCLUDED_WRITERPERFECT_QA_UNIT_WPFTLOADER_HXX
+
+#include "wpftqahelperdllapi.h"
+
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/uno/Sequence.hxx>
+
+#include <rtl/ustring.hxx>
+
+namespace com
+{
+namespace sun
+{
+namespace star
+{
+namespace beans
+{
+struct PropertyValue;
+}
+namespace container
+{
+class XNameAccess;
+}
+namespace document
+{
+class XFilter;
+}
+namespace frame
+{
+class XDesktop2;
+class XFrame;
+}
+namespace io
+{
+class XInputStream;
+}
+namespace lang
+{
+class XComponent;
+}
+namespace uno
+{
+class XComponentContext;
+}
+}
+}
+}
+
+namespace writerperfect
+{
+namespace test
+{
+class WPFTQAHELPER_DLLPUBLIC WpftLoader
+{
+public:
+ WpftLoader(const OUString& rURL, const css::uno::Reference<css::document::XFilter>& rxFilter,
+ const OUString& rFactoryURL,
+ const css::uno::Reference<css::frame::XDesktop2>& rxDesktop,
+ const css::uno::Reference<css::container::XNameAccess>& rxTypeMap,
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext);
+ WpftLoader(const css::uno::Reference<css::io::XInputStream>& rxInputStream,
+ const css::uno::Reference<css::document::XFilter>& rxFilter,
+ const OUString& rFactoryURL,
+ const css::uno::Reference<css::frame::XDesktop2>& rxDesktop,
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext);
+ ~WpftLoader();
+
+ const css::uno::Reference<css::lang::XComponent>& getDocument() const;
+
+private:
+ bool impl_load();
+ void impl_dispose();
+
+ void impl_detectFilterName(css::uno::Sequence<css::beans::PropertyValue>& rDescriptor,
+ const OUString& rTypeName);
+
+private:
+ const OUString m_aURL;
+ const css::uno::Reference<css::io::XInputStream> m_xInputStream;
+ const OUString m_aFactoryURL;
+ const css::uno::Reference<css::document::XFilter> m_xFilter;
+ const css::uno::Reference<css::frame::XDesktop2> m_xDesktop;
+ const css::uno::Reference<css::container::XNameAccess> m_xTypeMap;
+ const css::uno::Reference<css::uno::XComponentContext> m_xContext;
+ css::uno::Reference<css::lang::XComponent> m_xDoc;
+ css::uno::Reference<css::frame::XFrame> m_xFrame;
+};
+}
+}
+
+#endif // INCLUDED_WRITERPERFECT_QA_UNIT_WPFTLOADER_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/qa/unit/WpftWriterFilterTest.cxx b/writerperfect/qa/unit/WpftWriterFilterTest.cxx
new file mode 100644
index 000000000..8bc4c7cad
--- /dev/null
+++ b/writerperfect/qa/unit/WpftWriterFilterTest.cxx
@@ -0,0 +1,76 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "WpftFilterTestBase.hxx"
+
+namespace
+{
+class WpftWriterFilterTest : public writerperfect::test::WpftFilterTestBase
+{
+public:
+ WpftWriterFilterTest();
+
+ void test();
+
+ CPPUNIT_TEST_SUITE(WpftWriterFilterTest);
+ CPPUNIT_TEST(test);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+WpftWriterFilterTest::WpftWriterFilterTest()
+ : writerperfect::test::WpftFilterTestBase("private:factory/swriter")
+{
+}
+
+void WpftWriterFilterTest::test()
+{
+ const writerperfect::test::WpftOptionalMap_t aEBookOptional{
+ { "FictionBook2.fb2.zip", REQUIRE_EBOOK_VERSION(0, 1, 1) },
+ };
+ const writerperfect::test::WpftOptionalMap_t aEtonyekOptional{
+ { "Pages_4.pages", REQUIRE_ETONYEK_VERSION(0, 1, 2) },
+ { "Pages_5.pages", REQUIRE_ETONYEK_VERSION(0, 1, 8) },
+ };
+ const writerperfect::test::WpftOptionalMap_t aMWAWOptional{
+ { "MaxWrite_1.hqx", REQUIRE_MWAW_VERSION(0, 3, 8) },
+ { "MouseWrite_1.hqx", REQUIRE_MWAW_VERSION(0, 3, 8) },
+ { "RagTime_2.1.hqx", REQUIRE_MWAW_VERSION(0, 3, 2) },
+ { "RagTime_3.2.hqx", REQUIRE_MWAW_VERSION(0, 3, 2) },
+ { "RagTime_5.5.rag", REQUIRE_MWAW_VERSION(0, 3, 6) },
+ };
+ const writerperfect::test::WpftOptionalMap_t aStarOfficeOptional{
+ { "Writer_3.1.sdw", REQUIRE_STAROFFICE_VERSION(0, 0, 2) },
+ };
+ const writerperfect::test::WpftOptionalMap_t aWpsOptional{
+ { "Word_5.0_DOS.doc", REQUIRE_WPS_VERSION(0, 4, 3) },
+ { "Write_3.1.wri", REQUIRE_WPS_VERSION(0, 4, 2) },
+ };
+
+ doTest("com.sun.star.comp.Writer.AbiWordImportFilter",
+ "/writerperfect/qa/unit/data/writer/libabw/");
+ doTest("org.libreoffice.comp.Writer.EBookImportFilter",
+ "/writerperfect/qa/unit/data/writer/libe-book/", aEBookOptional);
+ doTest("com.sun.star.comp.Writer.MSWorksImportFilter",
+ "/writerperfect/qa/unit/data/writer/libwps/", aWpsOptional);
+ doTest("com.sun.star.comp.Writer.MWAWImportFilter",
+ "/writerperfect/qa/unit/data/writer/libmwaw/", aMWAWOptional);
+ doTest("org.libreoffice.comp.Writer.PagesImportFilter",
+ "/writerperfect/qa/unit/data/writer/libetonyek/", aEtonyekOptional);
+ doTest("org.libreoffice.comp.Writer.StarOfficeWriterImportFilter",
+ "/writerperfect/qa/unit/data/writer/libstaroffice/", aStarOfficeOptional);
+ doTest("com.sun.star.comp.Writer.WordPerfectImportFilter",
+ "/writerperfect/qa/unit/data/writer/libwpd/");
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(WpftWriterFilterTest);
+}
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/qa/unit/data/calc/libetonyek/fail/.gitignore b/writerperfect/qa/unit/data/calc/libetonyek/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libetonyek/fail/.gitignore
diff --git a/writerperfect/qa/unit/data/calc/libetonyek/indeterminate/.gitignore b/writerperfect/qa/unit/data/calc/libetonyek/indeterminate/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libetonyek/indeterminate/.gitignore
diff --git a/writerperfect/qa/unit/data/calc/libetonyek/pass/Numbers_2.numbers b/writerperfect/qa/unit/data/calc/libetonyek/pass/Numbers_2.numbers
new file mode 100644
index 000000000..307a49ccf
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libetonyek/pass/Numbers_2.numbers
Binary files differ
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/fail/.gitignore b/writerperfect/qa/unit/data/calc/libmwaw/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/fail/.gitignore
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/indeterminate/GreatWorks_1.0.hqx b/writerperfect/qa/unit/data/calc/libmwaw/indeterminate/GreatWorks_1.0.hqx
new file mode 100644
index 000000000..1f44c1744
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/indeterminate/GreatWorks_1.0.hqx
@@ -0,0 +1,61 @@
+(This file must be converted with BinHex 4.0)
+:#h0SC@9d,QGh,RBa!&T$38aD48*5!3!!!!Eb!!!&CiqC!3"D3d&-!*!,!3!!!"S
+!!J!$!!!'4f9ZCACKD3!@!!!(3fpeFQPPFJ!#!!!!SJ!!!!%!!`!!!!S!N!F0!!!
+!!3!$!!%!#J#3"`d!!!!"!!-!!J!+!*!($3!!!!%!!`!%!!S!N!F0!!!!!3!$!!!
+!#[rr!!"QCJ!0!!!!!3!$!!!!#QCQrrqCQ3!0!!!!!3!$!!!!#J!!CQErr`!0!!!
+!!3!$!!!!%J#3"aF!!!!"!"B!!!!+!*!($!!(!!!!!J!0!!J!!!!#!%X!$!!!!!)
+!$3!$!"i!"`#6!*!&)!"C!*!6"!!&!"i!!J!A!#3!!#HB!*!9"3!H!!N!$3!S!!!
+RQ!!+!*!6"J!*!!!!!J!Z!!S!!!!B!!!!!J#3&3X!!!!#!!!!$3!!!!J!!3!"!!F
+!(!!1!!!!#J%"!3!"N!3!!!!2!!!!$J!%!!3!#J!%!!S!"!!+!"!!!!!5!*!%![!
+#3!!a-M!`!*!'%3!!!!)!!!!5!!!!"!!!!!3!%`!!!"S!!3!"!!!!!J!!!-!!!!!
+("Qj[FQeKE!#3""-!!!!B!!)!!3!"!!)!!!"C!!!!"`4LEfaN!*!%%`!!!"S!!`!
+"!!)!!J!!!&N!!!!("QPdB@aTB`#3""-!!!!F!!3!!3!$!!)!!!"Z!!!!"`PeEQ4
+PFQaTEQ8!!!!6!!!!(J!(!!%!!!!#!!!!@3!!!!F+BQPR)'0[E(9YEJ#3""-!!!!
+@!!%!!J!%!!)!!!#%!!!!"`0bC@3!!!!6!!!!'!!#!!)!"3!#!!!!@3!!!!F&Ch*
+PC@i!!!!6!!!!'!!$!!)!"J!#!!!!@3!!!!F%BQaeC3#3""-!!!!F!!3!!J!(!!)
+!!!"C!!!!"`Na1#"`EfPZG(-!!!!6!!!!'J!&!!)!#!!#!!!!@3!!!!F(3fpeFQP
+PFJ!!!"-!!!!B!!%!!`!!!!)!!!"C!!!!"`9KE'PREJ!!!"-!!!!B!!)!!`!!!!)
+"!!"C!!!!"`4XC@Cd!*!%%`!!!"S!!`!$!!!!!J)!!&N!!!!("Q0PER4PFJ#3""-
+!!!!B!!3!!`!!!!)$!!#B!!!!"`9bD@GSG!!!!"-!!!!D!!8!!`!!!!)%!!#B!!!
+!"`CbCA"PBA3!N!36!!!!+!!"!!8!!!!#!!!!ZJ!!!!F8C'PQCQ9bC@jd)'jeE@*
+PFQPZCh-!N!36!!!!(!!"!!B!!!!#!!!!*!!!!!8rr-b3#!!!!"-!!!!F!!)!"J!
+!!3)!!!#B!!!!"6rmc*!)!!!!%`!!!"`!!`!'!!!#!J!!!*J!!!!&2rc-N!J!!!!
+6!!!!(!!%!!B!!!-#!!!!33!!!!8rr-b3#!!!!"-!!!!F!!8!"J!!"!)!!!!#!!!
+!"6rmc*!)!!!!%`!!!"`!"J!'!!!&!J!!!!)!!!!&2rc-N!J!!!!6!!!!(!!(!!B
+!!!-)!!!!@3!!!!8rr-b3#!!!!"-!!!!Q!!%!"`!!!!)!N!F(%h0[E@8JC'&dC5G
+c)'C[FQeKG(-!!!!6!!!!(!!#!!F!!!S#!*!("8!Y!!!!!K+5!*!&%`!!!"`!!`!
+(!!!,!J!!!&N!!!!&3#d!!!!#%T)!N!86!!!!(!!%!!F!!!`#!!!!@3!!!!9!,3!
+!!!)5NJ#3"4-!!!!F!!8!"`!!$3)!N!F&3#d!!!!#%T)!N!86!!!!(!!'!!F!!!i
+#!!!!@3!!!!9!,3!!!!)5NJ#3"4-!!!!Q!!%!#!!!!!)!!!"C!!!!"a0cEfeP)(4
+TE@8RFb"QEh*YBA4c!!!!%`!!!"`!!J!)!!!8!J!!!*J!!!!&2rl-N!J!!!!6!!!
+!(!!$!!J!!"8#!!!!Q!!!!!8rrXb3#!!!!"-!!!!5!!3!#!!!&!)!N!F"!!!!%`!
+!!#!!!3!*!!!!!J!!!*J!!!!($(0[E@8JCQpbEA9XB3#3""-!!!!S!!)!#3!!!!)
+!!!!N!!3#!!%!!!8rri!!N!J#!!-!#3!%!!N!%`!!!#i!!`!*!!!!!J!!!*J!$K$
+rri!!!J!$0!)!!M8!!!8rrm!!N!J"!!3!#3!6!!!!,!!%!!N!!!!#!!!!Q!!2%2r
+qJ!!3rrq!!#"!&`%!p!!&3!#J!*!+&%,l!!!"!!!!"18!!!2P!!!!JJ$ll*!'!!$
+lq`#3"I[XN!B!!2X!q`!!!!YcD'9PG#jRGbjf-3)!!J"D3d&-@N9#8J#3#!)!@N0
+"6&T&3P)!N"M2XJ2E!!!'mJ!!"@Ir!!$l!*!)r`$Xr`!!!2X!!-$!`!!!r`$Xrrm
+!!!$l!0MB`2m!+rrrr`$r!!!!qpMBf2rr!2rm+`!!r`!!!2[Bf0Mr"Im!TD@P!2m
+!!!$l!2rr"38&!*!&r`!!!2X!N![r!!!!rj!0!*!&'J!"!CX#$J!V!!8!+`!&!FB
+#%`!V!!8"fJ*k!!!!H!!2!!!!5!")!*!%![!#32rarqi$#3*5B`)&+!2m!3!!!!&
+S!@J!N!31X!Y!!!%"!!"N!!%!!!!"!!)!!!!"*`m!!3#3$K!!N!N3!2qerkB2,3Z
+D!!J"!*!0'3%!!!-#!'$rN!LU9DT9UP@U93#3#(rrrrrhrrrrIrrhrhrrprphrrr
+rGrrrrhIrhrphrrhrGrrGrhIrhIp9rphr9IrGreArl[p9rl[r9Ip9reAr9IphhAI
+GGpehh9@r9Ip9qeAr9EY9re@l9Ip9[eAZ9IY9lP@l9Hj9ZeAZ9EY9kP@l9Dj9ZP@
+V9ET9UeAU9DT9VP@UUK@U9DT4UP@U4DT8UN@U9+T%UK@U4+T4UN5U%DT%UK'U3+S
+4UJ5U%DT%UJ#U4+S!UN#U!+S%UJ#))SJLL#+))US!UJ#U!+S!UJ!4!+S!4!#U!#)
+!UJ!L!)J!)J#)!#)!L!!J!)J!!J#)!!!!L!!!!)!!#!#!!!J!J!!!!!J!!!#)4#)
+4L%3L%4%L4)J4)N5)J%!J%!J%!J%"!J3)%#"!J1"`1"`1"i2"J`F1($K`i-')4#)
+!L%3L!"%L4!!4)N3!JN3S%#K%JJ'Cc'BcQFaQ-hHlhHjhZphZlYflGqlGZhGr[pr
+[pr[pr[lpqrI[hlpr(ir(ir(iI$limH2(MamqI(HlhIphZphrlYflrqlGZrppZpI
+[elYprM0Qc*NcCXbCUT!)c*!)L*!)r`!!!2m!!!#!N!Mr!*!(#)#!#!L!J!KQ!!!
+!Q3!!!2q)L)MrL)L)ri#3"rm!r`$r!2m!rrm!!2rr!!"hN!J!rrrr!2rrrhq3#!$
+rN!IhIhrhphprpjRrrrpQrrrr!(GhG`"hGhF!Ij!(m*!%$j!%Q@CQQCPQCTN!#"`
+qIciF#!!)&#T9+K3)X6!$'pM!$)f!%!)J!3K!"!J8)N'!!3)%J-!K%J`%!J(rJ)#
+!r`J)#!"rIhm!prIhJ%!J!!)%#!##4$P%JJ%"!IKd)NH2&b*a[k#r[Ehp"Ie9S%"
+!93S%")K%)K%4)N5)J8)N')&#*"LU!)!!L!#!!!1%5$!-!J%"J)""2JJ)&1-!N!X
+S!3'!!!!!"RBa,M!Z-4T6H@eKER4PBb"(FQ9KG&G[FQYc)(Ba,M!Z-3!!!"888hP
+YB@jdC@-J4h*PBA4AEh*VFkS!!!%!!!!%j3!!!q8!!!##!&Zcl"Mk!!!!(!##!!4
+A8&01!!!!+P"56P3!!!!f8%&8)`!!!%*fCA*c!!!!6P088L!!!!"D!!(rr`#3"9Z
+b#!!"rrm!!!!H!&Za9!!"rrm!!!#D!&Zal!!#rrm!!!1J!&Zb!,rdrrm!!!2-!&Z
+aV-@%:
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/indeterminate/GreatWorks_2.0.hqx b/writerperfect/qa/unit/data/calc/libmwaw/indeterminate/GreatWorks_2.0.hqx
new file mode 100644
index 000000000..bf34a4854
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/indeterminate/GreatWorks_2.0.hqx
@@ -0,0 +1,125 @@
+(This file must be converted with BinHex 4.0)
+:#h0SC@9d,QGh,RBb!&T$38aD48*5!3!!!!R!!!!3ZkT9!J"D3d&-!*!,!3!!!"S
+!!J!$!!!'4f9ZCACKG3!@!!!(3fpeFQPPFJ!#!!!"D!!!!!%!!`!!!!S!N!F0!*!
+'rj!'!*!0!3!$!!%!#J#3"`d!N!ErN!B!N!PT!!!!!3!$!!)!#J#3"`d!N!ErN!B
+!!!(a!3X#2!!1!!!!!3!$!!3!#J#3"`d!N!ErN!B!!$mm!!%[$Nkk!!!!!3!$!!!
+!#[rr!!"QCJ!0!*!'rj!'!!!JE[c52bJ!F!!!!!%!!`!!!!TQC[rrQCN!$3#3"[q
+3"J!!-"mb(l""EJ3!!!!"!!-!!!!+!!"QC[rr!!d!N!ErN!B!!'i%2S"J!Mk"!!!
+!!3!$!!!!%J#3"aF!N!ErN!B!!$eIrrT#CdkY!!!!!3!@!!!!#J#3"``!N!ErN!B
+!!%kkrN)YE[rd!!F!!!!#!!d!#!!!!!)!5`!-!!!!!J!0!!-!*!!(!*-!N!8J!&N
+!N"N%!!8!*!!#!"F!*!!!*jJ!N"X&!#3!#3!0!#J!!#HB!!S!N"N'!!N!!!!#!#i
+!#J!!!"i!!!!#!*!8rqD3!(`"!!!,!!!!!J!!!!d!!!!B!!%!!3!(!"`pI!!&rpC
+#C`$S6VVqC"!Z!!i!!!!+!3%"!!%"!'i!!3!2!!!!$J!%!!3!#J!%!!S!"!!+!"!
+!!!!+!'ib-$!!N!B4!!!!!J!!!")!!!!%!!!!"!!9!!!!#J!"!!J!#3#3"4B!!!!
+`!!m!!!!5!!!!'3!!!")!!2ra!*!'rr%!!!*!!!$rm3#3"[ra!!!#3!!!!"F!!!!
+c!*!%!3!"!3!9!!!!$!#3"[rr!!!!!3#3#2ra!*!'rrm!!!*!!*!%'!!!!$-!N!3
+"!!%"!"8!!!!-!*!'rj!',J!!)2rr!!$rm3#3"[rr!!!#3!#3""N!!!!%!!!!&!!
+D!!!!!J!"!"X!!!$f!*!%Irprr`#3"(rrIrm&+!2m!%J!5!"M!!%!!!!"!!!!!3!
+!6Ud!N!C#Crq3"J"b!*!(N[q3"Qd%!!(rN!J!!`#3#3(rjY"ZrpSr!%kY,J)[$Nk
+kr3BJE[qfF!5`D!#+CKK#Cb"ZrlC)D!#-2blrjNkY,Y)[$J!!r1)JE[qfF!1`D!#
++CR)JEJ!"!!%!!3!!!!X!"3!12rf[S09lY$AK4d!#lGYUjadKGES"VJ%!!"8!!!!
+-!*!*!3!!"Pi!!3!5!!!!@J"N!!B"!*!%#3!!!!%!N!8F!!!!(!!!!!3!!!!%!!!
+!"!#3"cB!!!#U!!!!!J!6!!!!'J!"!!%!!!!#!!!!`!!!!!F'EQpbE@&X!*!%%`!
+!!"J!!J!"!!%!!J!!!&N!!!!("'*[E'3!N!36!!!!'J!$!!%!!J!#!!!!@3!!!!F
+'DA4KE'PM!*!%%`!!!"`!"!!"!!-!!J!!!'i!!!!(#A9ZC'9bE'PZC3!!!"-!!!!
+H!!F!!3!!!!)!!!"C!!!!"`TLD@FJBfpXG@eZ!*!%%`!!!"B!!3!#!!3!!J!!!)3
+!!!!(!h*PC!!!!"-!!!!B!!)!!J!&!!)!!!"C!!!!"`9RFQ9PEJ!!!"-!!!!B!!-
+!!J!'!!)!!!"C!!!!"`4LE(9P!*!%%`!!!"`!"!!#!!F!!J!!!&N!!!!(#6%i)("
+[D@jdF`!!!"-!!!!D!!8!!J!)!!)!!!"C!!!!"`G$Eh9bD@9b!!!!%`!!!"J!!3!
+$!!!!!J!!!&N!!!!("@&XD@GZ!!!!%`!!!"J!!J!$!!!!!J%!!&N!!!!("'aPCR3
+!N!36!!!!'J!$!!-!!!!#!J!!@3!!!!F'Bf9ZG'9b!*!%%`!!!"J!"!!$!!!!!J-
+!!*J!!!!("A*TCfKd!!!!%`!!!"S!"3!$!!!!!J3!!*J!!!!("R*PF'9KG!#3""-
+!!!!S!!%!"3!!!!)!!!#k!!!!"a4ND@CQCA*PER3JER9YBQ9bD@jRF`#3""-!!!!
+F!!%!"J!!!!)!!!!N!!!!"6rmc*!)!!!!%`!!!"`!!J!'!!!"!J!!!*J!!!!&2rc
+-N!J!!!!6!!!!(!!$!!B!!!)#!!!!Q!!!!!8rr-b3#!!!!"-!!!!F!!3!"J!!!`)
+!!!""!!!!"6rmc*!)!!!!%`!!!"`!"3!'!!!%!J!!!!)!!!!&2rc-N!J!!!!6!!!
+!(!!'!!B!!!8#!!!!!J!!!!8rr-b3#!!!!"-!!!!F!!F!"J!!!`J!!!"C!!!!"6r
+mc*!)!!!!%`!!!#B!!3!(!!!!!J#3"`F6FfpYC5"NBA4P*h-JCQpbE@&dF`!!!"-
+!!!!F!!)!"`!!#J)!N!F&3#d!!!!#%T)!N!86!!!!(!!$!!F!!!X#!!!!@3!!!!9
+!,3!!!!)5NJ#3"4-!!!!F!!3!"`!!$!)!!!"C!!!!"8!Y!!!!!K+5!*!&%`!!!"`
+!"3!(!!!0!J#3"`9!,3!!!!)5NJ#3"4-!!!!F!!B!"`!!$J)!!!"C!!!!"8!Y!!!
+!!K+5!*!&%`!!!#B!!3!)!!!!!J!!!&N!!!!(%h0[E@8JG'PYC5Gc)'C[FQeKG(-
+!!!!6!!!!(!!#!!J!!"3#!!!!Q!!!!!8rrXb3#!!!!"-!!!!F!!-!#!!!&3)!!!#
+B!!!!"6rqc*!)!!!!%`!!!")!"!!)!!!8!J#3"`%!!!!6!!!!)!!"!!N!!!!#!!!
+!Q!!!!!F-FfpYC5"QEh*YG@aK!*!%%`!!!#J!!J!*!!!!!J!!!#3!"!)!!3!!"6r
+rJ!#3#!)!!`!*!!3!#3!6!!!!,J!$!!N!!!!#!!!!Q!!1%2rrJ!!#!!-d!J!#03!
+!"6rr`!#3#!%!"!!*!"-!!!!X!!3!#3!!!!)!!!#B!!m3rrk!!"$rri!!)%!A!3$
+d!!9!!+!!N!S8c!8!!!%!!!!2e3!!$Y8!!!$Q!!!2c-m!!!r`!!$mr3!!$mm!!2r
+3!!!2rr!!m!!!!!`,FfKPCA3ZChFZGM)#!!!!@N0"6&T&3P)!N!TD3d&-@N9#8J#
+3'-qb#NS!!!R!!!!3Zrrrrr!!!!$r!*!1rc(rN!J!N!Ar-6%arr@3"Irr!*!&rc(
+rqI@3"Irhr`#3"2rrqI@3"[q3"!!!!2rep3$eN!AhprRr!!!!rrArN!Rjr`!!!2r
+erm,m`[c#r-,mq3!!!"S!!3'E!Ji!+`!&!#X!"3('!K-!+`!&!GS#HJ!!!(J!$`!
+!!%J!5!#3"!,`!N$rmIrZ!`N#8Q-#"5J$r!%!!!!"D!&S!*!%$V!,3!!"!3!!C!!
+"!!!!!3!#!!!!!5F2!!%!N!i3!*!*%!$rYIqQ$bd,QJ!)!3#3$4N"!!!$!J"Jrj!
+)UP@U9DT9UP8!N!KrrrrrprrrrhrrprprrrIrGrrrrhIrrrphrprrGrrprhIrhIp
+hrphr9IrGreArhIp9rqlr9IqlreAr9Ip9reArGpehhAIGGpe9[eAr9IY9re@l9Ip
+9ZeAr9Ep9lPAl9Hj9ZeAZ9EY9lP@l9HT9Ze@Z9ET9Ue@k9DY9kP@U9Dj9UUS9UP@
+U8DT9UN@U9+T&UP5U4+S9UN5U8DT%UK'U4+S4UN#U%DS%UK'U4+S!UN5U!+T!UJ#
+U"+S!L#+))SJLL#+U!+S!UJ#U!+S!%3#U!%3!UJ!L!+S!)J#)!#)!L!!L!)J!)!#
+)!!)!L!!!!)J!!!#!!!J!J!!)!)!!!!!)!!!!L%3L%BK%)K%4)N5)%5*%L)"!)"!
+)"!)"!3)%#"!J3)$JF$JF$JH$`B-($K`iF1$"L%3L!)K%)J!4)N3!%5*%!)*%+"!
+S4))"QFaQ-jR-CM0hZphZGl[GlZlGZhIZhEYhIlrIlrIlrIlqrI[hlpqrIaq2aq2
+aq(`qq2(MaimI2RahZphrGl[GrqlGZrrZhE[rIE[AlpHlIIicCXbC-fE-QDU3#-b
+3#)L3#2m!!!$r!!!!J*!)r`#3"`L!J!J)J)!)CJ!!!*N!!!$rL)L)riL)L2q!N!I
+r!2m!r`$r!2rr!!$rr`!!Gj!)!2rrr`$rrrprN!J!rj!(phprprGrIrHCrrrrC[r
+rr`"hGhF!GhGh!(q3"r#3"!q3"*PQCTQCCQDC!!JF2Rmq(!J!#"3U95S8#,%`!a[
+B`!b0J"!#)!%)3!3)&#*"J!%#")$!)4)-"!)"ri#!J2m)#!J!Ihpr!2Ihpi"!)!!
+#"!J!JN3j4))"!3(iG#*(MaFLFEqJ[lfpr3Ap9D"!3&8+"!5)4#)4%5*%L)&#*"L
+"3L3BUJ#!!)J!J!!$K%J`$!)"!B#!36i)#"6M!*!+"Q3!!J!)rj!'r2ccm`8&rrp
+NC!)#hGd)#!B'm[))#)5%4NB!!+@P!*!%e03#!UZVkZSI(lHh&"3!!'4N%4&@9L`
+X"3@3!*!!FA%k1X#3"S#3"N#3"J#3"[q3#Xc-rj!%QCRrN!4QC[q3"$-crj!%!!$
+rrmc-rj!%c*!%rrr-c*QCrrr-c'CQrrr-c$-crrr-c!!!rrqCQIq3"*QCc-crrjQ
+3"2rrQCPQC[rrQCNc-rrrQCN!!2rrCQErN!4QCXc-rrpQCTQCrrpQN!6rrfCQ-c2
+rrfCQ!!$rrc-crj!%-c2-c2rr-c1CQIrr-c0QC[rr-j!%rrmc-`!!rrm!!2q3"!!
+!c-crr`!!QCRrr`!!CQErr`!!-c2rr`#3"-c-rj!%c-crrmb3"2rrQCR-c2rrCQE
+-c2rr-c2-c2rr!!$-N!6rrmb3#TQCc*!%CQE-N!3c-mb3"!!!c-bCQIrrc-bCQFb
+3"*Q3"-c-QCPQCXc-QCNc-mc-QCN!!-c-CQErrmc-CQE-N!4QCTQCc-aQN!6-c'C
+Q-c2-c'CQ!!$-c$-crrr-c$-cc*!%-c1CQFc--c0QCXc--j!%c-`c-`!!c-`!!2r
+rc-`!!-b3"!!!QCR-c!!!CQE-c!!!-c2-c!#3"*QCrj!%QCRrrmc-QCRrrjQ3"2r
+rCQDCQIrr-c1CQIrr!!#CQFc-rrqCQFb3"*QCc-bCN!6-c'CQQCR-c$-cQCR-c!!
+!QC!%rrqCN!6-c*Q3#QCQQC!%-c1CN!3!!*QCCQErrjQCCQE-c*QCCQDCN!4QN!5
+CQ@CQ-c1CQ@CQ!!#CQ6-crrqCQ6-cc-bCQ6-cQC!%-c0QCTQC-j!%QCNc-`!!QCN
+!!2rrQCN!!-c-QCN!!*Q3"!!!CQDCQ3!!-c1CQ3#3"'CQrj!%CQErrmc-CQErrjQ
+CCQErrfD3"2rr-c0QC[rr!!"QCXc-rrpQCXb3"'CQc-bCQ@CQc-aQN!6-c$-cCQE
+-c!!!CQDCQIrrCQDCQFc-CQDCN!4QCTQCCT!%QCNc-fCQQCN!!'D3"2rrCT!%c-a
+QN!5CQ@D3#M-cCT!%!!"QCM-crrpQCM-cc-aQCM-cQCPQCM-cCT!%-j!%CQBc-`!
+!CQB!!2rrCQB!!-c-CQB!!*QCCQB!!'D3"!!!-c0QCJ#3"$-crj!%-c2rrmc--c2
+rrjQC-c2rrfCQ-c2rrc13"2rr!!!c-mc-rrmc-mb3"$-cc-bCQ6-cc-aQCM-cc-`
+cN!6-c!!!-c1CQIrr-c1CQFc--c1CN!3c-jQCCQBc-jQC-j!%QCN!!$-cCQErrc-
+cCQE-c$-cCQDCQ6-cCT!%-c0QCM13"'CQ!!!cN!6rrc13"-c--j!%QCNcN!4QCM1
+3#J!!-c-!!2rr-c-!!-c--c-!!*QC-c-!!'CQ-c-!!$13"!#3"[q3"!!!rrr-c!!
+!rrqCQ3!!rrpQCJ!!rrmc-`!!rrm!N!6-c2rr!!$-N!3!!-c-QCN!!-c-CQB!!-c
+--c-!!-c-!*!%QCRrr`!!QCR-c!!!QC!%!!#CQ@CQ!!#CQ6-c!!#CQ3#3"'CQrrm
+!!'CQc-`!!'CQQCN!!'D3"!!!CQBc-`!!CQB!N!3c-rrr!!!c-mc-!!!c-jQC!!!
+c-fCQ!!!cN!3!!$-c!*!'rrm!N!6-c!#3"*QC!*!%CQB!N!3c-qlZ!*!%hGd!N!5
+lZ`#3"+UU!*!%L)J!N!4hG`#3"&99!*!%4%3!N!3L)J#3""%4!*!'lZi!N!6Gh3#
+3",Zl!*!%UUS!N!5)L!#3"(Gh!*!%998!N!4%4!#3"#)L!*!%%4%!N!EZlJ#3"0h
+G!*!%ZlX!N!5UUJ#3")L)!*!%GhF!N!4993#3"%4%!*!%)L)!N!34%Hk3"Yf3"VZ
+3"UU3"SL3"RH3"P@3"N53"L+3"K'3"J#3#33!N!B"!!!"rj!'!*!*!Iq3"J#3"bd
+!!Iq3"J#3"eS!!Iq3"J#3"iF!!Iq3"J#3"l3!!Iq3"J#3"q%!!Iq3"J#3"J%1!!(
+rN!B!N!B"1`!$rj!'!*!*!`#3"[q3"J!!!!,rN!B!N!N#rj!'!*!(Y!!"lZi!N!5
+)L!#3"`%!!1lZ!*!%998!N!8"!*!%rrm!N!5)L!!!!!(rN!6-c2q3"!#3"J(d!!)
+!#3!!!!5!!*!K"U3!!1!9rrm!!J!*!!!!#3!!rrm!!ZXq!*!%i"Irr`!#lF)!N!6
+J'2rr!!,Z63#3"FArr`!#!!3!5!!!!!5!!!!*!!!!")!!!'Arr`!#9#X!N!9Qrrm
+!!P4c!*!&D2rr!!*9,3!#!!5!!!!%J!"9T`#3"Arrr`!#9E%!N!9prrr%!P@j!!#
+2j!!!rrr!!PBB!!!!"J")!!!!")!!!!N!!!!%J!!!#3!!!!5!!!$(rrm!!QrR!*!
+&DIrr!!,`JJ#3"3)!%J!!!!5!!*!%Drrr!!,`p!#3"@hrr`!#mCS!N!6J!2rr!!*
+6E!#3"3%!"J!5!!!!")!!!!%!!!!%J!!!!3!!!!5!!!!#8kF!N!6`!2rr!!-*-J#
+3"2!"rrm!"!!*!!!!")!!!!%!!!!%J!!!!2!&rrm!!`PM!*!%i"rrrb!$#Ad!N!6
+J"[rr)!-!"J!*!!!!")!!!!N!!!!%J!!!!3!!!!5!!*!&i#,rr`!$#Td!N!6J"2r
+r!!-+V3!#!!%!!!!%J!!+``#3"1!$rrm!!`V6!*!%m!Err`!$#bF!N!6`"rrr!!-
+,T!#3"!'!!!%!!!!,!!8!$MrpVk$9Hl3ei8G!!ZhEDZFG)A@k!Di!!J!!!!X!"3!
+12rf[S09lY$AK4d!#lGYUjadKGES"0!!'!!!!#`!&!!irrDqJeAZd0H&(3!,YffV
+R(5&eZJ(Z!!8!!!!,!!8!$MrpVk$9Hl3ei8G!!ZhEDZFG)A@k!3)!"!!!!!X!"3!
+12rf[S09lY$AK4d!#lGYUjadKGES"!!!"!!!!#`!&!!irrDqJeAZd0H&(3!,YffV
+R(5&eZJ$Z!!)!!!!,!!8!$MrpVk$9Hl3ei8G!!ZhEDZFG)A@k!2`!"J!!!!X!"3!
+12rf[S09lY$AK4d!#lGYUjadKGES!,J!&!!!!#`!&!!irrDqJeAZd0H&(3!,YffV
+R(5&eZJ$b!!3!!!!,!!8!$MrpVk$9Hl3ei8G!!ZhEDZFG)A@k!&B!!`!!!!X!"3!
+12rf[S09lY$AK4d!#lGYUjadKGES!#!!$!!!!#`!%!"%rr1bM##J4R&NN3!1,YXK
+)Bme$j3"@!!!!+!)!J!!!!`Cf-Li`,M%D8hPYB@jdC@-J4h*PBA4AEh*VFb"f-Li
+`,M%!!!!9&&0jE@&ZG'9M)%GbC@&d9fpbDh1U!!!"!!!!$p8!!!l9!!!!jJ"HC1`
+BqJ!!!"`!jJ!*9e"66J!!!&*38Nj8!!!!AP""9#-!!!"U8'a89!!!!(C1H%9N!!!
+!JNGb4&-!!!#14'&)8`!!!*T"8P*c!!!!TRCPFR-!!!#b8e45)!!!!,i!!Irr!*!
+&AQ+i!!(rr`!!!"i!AQ+m!!(rr`!!!*S!AQ*!!!(rr`!!!k!!AQ)m!!(rr`!!#JJ
+!AQ+S!!(rr`!!#K!!AQ+N!!(rr`!!#a3!AQ+J!!(rr`!!$3`!AQ+8!!,rr`!!$T!
+!!&jLQ,rdrrm!!!km!&jLN!"hAJ:
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/indeterminate/GreatWorks_DB_1.0.hqx b/writerperfect/qa/unit/data/calc/libmwaw/indeterminate/GreatWorks_DB_1.0.hqx
new file mode 100644
index 000000000..872304de2
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/indeterminate/GreatWorks_DB_1.0.hqx
@@ -0,0 +1,115 @@
+(This file must be converted with BinHex 4.0)
+:#'4KG'%ZChFa!&T%3P0D48*5!3!!!#+J!!!&CiPR!3"D4%*6!*!-)!!!!#!!!!!
+J!*!,"J!!!!B!!!!'!*!,#J!!!!S!!!!+!*!,$!!!!!`!N!3)!!!!#!!!!!J!N!F
+)!!!!"`!!!!J!!!!)!!)!!J!!!S!!!!1!!!!$S!!!!m!!!!2J!!!%!!!!"#!!N!B
+&`2q38(9bH5"6BfKXBQX)6Q9h)&P[FQX36faN)%9ZCfaTFfJJ9'9iG"02E'3J4@j
+RE'PcD#"8CAKd)%e8"%pZHAJ'6hKQEh*N#&"KE'&dD@j[$P0MFQP`G#"09#"#Efa
+N"90hD@jR"P0jE@*[E!K8C@aPG'9iG!98D@ePF`G89&P'Efjd$9TKF'BJ3fKKEQ0
+PFRN0@Q&`CL"%D@jRBQ&dF`4DC@&X"9C8-6!`!!!!#!!E!!J!@Yi)!!!!'`8j)("
+dF`)a-!)a-J)a0!)a1!)b0!)c0J)d1!!!!3!!!!Qq!!!)[J!!!Ui!9S+-'2S!!!!
+F!Ui!'d4TEQB!!!$L8e4C53!!!1j69&)M!!)!qP934%`!!`%H4&"$E`!+!!!!&!!
+!#!!!!!J!!!!)!*!*!CC%8%CK!!S!!!!8!!!D!!!!'J!!!"S!N!N"aP"cCA3!#J!
+!!"3!!"`!!!!F!!!!(!#3#3(f8(*Q-3!+!!!!&!!!(J!!!"i!!!!H!*!*!LC3FQB
+e!!%!!!$d!!3!2!!(!!%"!3!!!#!!N!i#!!!""(4PH(30mF3!D,mL!'Lr*!!BhBi
+!!2q3"!!"!*!&"3!"!3%!!!!J!*!1!L!!!JCZG@eLCA,%!'Lr)J"S[b3!'0f1!!$
+rN!3!!3#3"3N!!3%"!!!!)!#3$J*!!!-%C'&dC3haa!"S[b)!D,mN!"MGMJ!!rj!
+%!!%!N!8+!!%"!3!!!#!!N!i#B!!%"(4TE@80mF3!D,mL!'Lr*!!BhBi!!2q3"!!
+"!*!(!rrr!!)!!!!-!!)!"!!!$J!!!",JhP!"!2rr!!!$J!"DhN`!!`!!!!3!!!!
+mhNJ"!2rr!!!%+J"DhN3"!2rr!!!%AJ!%!!!!"!!!!4)%rJ"DhM`"!2rr!!!&2J"
+DhMJ"!2rr!!8!!!!%!!!!![rr!!!&MJ"DhM!"!2rr!!!&Q!"DhL`!"J!!!!3!!!!
+#hLJ"!2rr!!!&TJ"DhL3"!2rr!!!&X!!(!*!%rrm!!!C'!&VH(!%!rrm!!!Cb!&V
+H'!)!rrm!r`!!!#3%G'pdE`"!!-!!N!G!,3!!!!%G@J!!`#d!!!!916[!!0i)"J#
+3&2m!!!!N"(4TG'N!3!'J!*!(3#d!!!!#%S3!!-!Y!!!!&6NlP98!N!S"6b8"EA"
+N)8&38%`!r`!!!%SU+'0[ER4KD@jc)$3JCQPPE'4c1L"dCAKd,fjeE@*PFLpNBA4
+P,h4TE@8Trhrr3$)!N!Crrd!b!*!'Irp!-J#3"R"bC@B%!*!-r`!!!&Jj+#"TEL"
+QD@9XC#!a1L"dEh4[,(4eG(8XG'PdD5XJG'KPFf8JCQPfC5"MEfeYC@jdFbFJE'P
+ZCA-TIrp!-J#3"Rrr3$)!N!Crrd!b!*!*r`!!!$)6+'PZ)'CTC@aN)$)k)$-X0#`
+e+Arr3$)!N!Crrd!b!*!'Irp!-J#3"R"bC@B%!*!%$!!!!!B!!!%"!'F!N!r[!*!
+%J!#3""S!!!(F!E)"L!&H!63"#J$J!,B!M!"L!$J!$N&r!!J!N!`%3!!!!!%!!"I
+!!!!!!J!!")!!!!!$!!!%`!!!!!3!!!8J!!!!"3!!"B!!!!!'!!!B!*!%"`!!''!
+!!!!)!*$r!*#c3Am!#!$#!*!)+#"TEL"QD@9XC#!a1L"dEh4[,(4eG(8XG'PdD5X
+JG'KPFf8JCQPfC5"MEfeYC@jdFbFJE'PZCA-T+'0[ER4KD@jc)$3JCQPPE'4c1L"
+dCAKd,fjeE@*PFLpNBA4P,h4TE@8T+'PZ)'CTC@aN)$)k)$-X0#`e+5KTEL"QD@9
+XC#!c1L!a,c%[0#`a,c-a,c3X-6)[-5mi15NSD@iJCQPPE'3J0$SJ-cS`-#`J0$S
+`-#`J06S`-#PdDA4TG'pdEh4eG(8!1@0fQ,Dk[J!!!!8!!!!%!!!!"J!!!!F!!!!
+)!!!!!`!!!!%!!!!#!*#Y""kS!*"B3Am!#!#3%3%!N!F#!*!(!`#3"`3!N!F&!*!
+("J#3"`F!N!F)!*$r!*#c4!!!#!#3#`%!!!!#!!!!!`!!!!3!!!!&!!!!"J!!!!F
+!!!!)!*$r!*$@#3!!"-`!@l%B!!%+4'&dB5"&ER4bHDd!!rc8!!`jI!!*!(JjI!!
+"!(TJ'!!"!!8!!3!"!!3!N"!#*`!!!)S!!!!+!!!!#J!!!!S!!!!I!!!!(J!!!"m
+!!!!H!!!!!3%!N!N&+!2m!%J!5!!$!!%!!!"EXC3!#!#3"!%!!!-!!!")!%J!N!3
+#fJ)Srq(riJ,j!NB$4`8S!r`!!J!!!%J!5!#3"!,D!LJ!!3!!!'3!!!!"!!%"!3!
+!!!%R$`!"!!%!N!d#!"N"N!!!N!9!!*!F!E3!!!#J!!!!"!!!!"3!#!!f!3!!&J!
+!!#d!!!!N!!!!4!!!!!%!!!!"!!!!0`#3"!%!N"8+!!!8!!!!53!!!#8!!!%4!!!
+!!J!!!!)!!!!F!*!%!3#3&3%!!$%!!!!8!!!!2`!!!%3!!!!"!!!!!`!!!$N!N!3
+"!*!9#J!!,`!!!%N!!!"!!!!"%3!!!!)!!!!%!!!!(!#3"!%!N"8"!!"-!!!!+!!
+!!&S!!!"%!!!!!3!!!!8!!!!h!*!%!3#3&3S!!%S!!!"*!!!!@`!!!4%!!!!#!!!
+!"J!!!"`!N!3"!*!9!3!!C`!!!#N!!!"e!!!!4!!!!!%!!!!(!!!!0`#3"!%!N"8
++!!"P!!!!53!!!(B!!!%4!!!!!J!!!!J!!!!F!*!%!3#3&J-!0!!%!!%!!!!"!*!
+Drj!'!*!'rj!'!!3!!3!!!!%!!!!"rj!)!*!1rj!'!*!'rj!'!!!!!3!!!!%!!!%
+"rj!)!*!1rj!'!*!'rj!'!!!!(J!)!!)!!3!#!!-!"!!&!!B!"`!)!!3!"!!!!!%
+!N!89!!!!$!#3#"3#!*!'!J%!&3!"!!`!N!ErN!S!!!!#!'F!!!!T!!!!G3!!!%3
+!!!4dD@eP!!-!!`!!!!%!N!89!!!!$!#3#!S#!*!'!J%!&3!"!!`!N!ErN!S!!!!
+#!%`!!!!S!!!!@J!!!%3!!!4NBA4P!!)!!J!!!!%!N!89!!!!$!#3"`)!!J#3"J)
+"!"8!!3!-!*!'rj!+!!!!!J!a!!!!&!!!!$m!!!"%!!!'ER9YBQ9b!!%!!3!!!!%
+!N!89!!!!$!#3#3)!N!B#!3!9!!%!$!#3"[q3#J!!!!)!&J!!!#d!!!!N!!!!4!!
+!"(4PH(3`$)#L-&J!Sc#N!+3`m!!*!!!%c!"EX5!!!`K$EfaeE@jKFJ#3"i!!!!`
+!!ST!!!!!!S8!!'`!!3!K!!%!!J!$!*!3!LF!!!!9!!!!&!!!!!S!!!!+!!!!(`!
+!!"i!!!!I!!!!(J!!!!%"!3#3#!8S!r`!5!")!!-!!3!!!&ZaM!!)!*!%!3!!!`!
+!!%J!5!#3"!,D!LMriIrL![N#4J0("5J$r!!#!!!!5!")!*!%!YS#+!!"!!!!C!!
+!!!%!!3%"!!!!!5F2!!%!!3#3$3)!'3'3!!#3"8!!N"`"Y!!!!+!!!!!%!!!!&!!
+)!$B"!!!%!!!!!3!!!")!!!!B!!!!!3!!!!%!!!!h!*!%!3#3&3S!!"8!!!!"!!!
+!*J!!!)F!!!!#!!!!!J!!!"`!N!3"!*!9!3!!"!!!!)S!!!!5!!!!ZJ!!!!%!!!!
+$!!!!13#3"!%!N"8+!!!9!!!!LJ!!!#B!!!%3!!!!!J!!!!3!!!!F!*!%!3#3&3%
+!!!3!!!%6!!!!%J!!!5m!!!!"!!!!"3!!!$F!N!3"!*!9#J!!&3!!!4-!!!!Q!!!
+"Q3!!!!)!!!!'!!!!(!#3"!%!N"8"!!!%!!!"R!!!!")!!!'h!!!!!3!!!!F!!!!
+h!*!%!3#3&3S!!"8!!!'F!!!!*J!!!L)!!!!#!!!!#!!!!"`!N!3"!*!@!`!d!!3
+!!3!!!!%!N"VrN!B!N!ErN!B!"!!"!!!!!3!!!!(rN!J!N!lrN!B!N!ErN!B!!!!
+"!!!!!3!!!3(rN!J!N!lrN!B!N!ErN!B!!!!H!!J!!J!"!!)!!`!%!!8!"J!(!!J
+!"!!%!!!!!3#3"48!!!!-!*!)&!)!N!B#!3!9!!%!$!#3"[rr!*!'rj!%!!!!"!!
+!!C`!!!!5!!!"Y`!!"(4TE@8!!`!$!!!!!3#3"48!!!!-!*!)#J)!N!B#!3!9!!%
+!$!#3"[rr!*!'rj!%!!!!"!!!!4-!!!!5!!!",`!!"'4KG'8!!J!#!!!!!3#3"48
+!!!!-!*!(!J!#!*!'!J%!&3!"!!`!N!Err`#3"[q3"!!!!!3!!!#+!!!!%J!!!,S
+!!!CZG@eLCA)!!3!"!!!!!3#3"48!!!!-!*!*!J#3"J)"!"8!!3!-!*!'rrm!N!E
+rN!3!!!!%!!!!!3!!!")!!!!B!!!%G'9iG!#3$rm!!!!N"(4eG(8!3!'!!*!(3#d
+!!!!"(CB!!-!Y!!!!&6NlUUYPFJ#3&Im!!!"#)LKTEL"QD@9XC#!c1L!a,c%[0#`
+a,c-a,c3X-6)[-5mi15N!Irp!-J#3"Rrr3$)!N!Crrd!b!*!Ir`!!!$iH+'PZ)'C
+TC@aN)$3k)$-k-$!X)$3k-$!X)$8k-$!T!(rr3$)!N!Crrd!b!*!'Irp!-J#3)`J
+!!!#-!*!&+3)S!*!&+3)S"5J$r!")!%J!!`!"!!!!!3!"!!%!!`#3"[q3"J#3"[q
+3"J!9!!!!$!#3#3%!!!B'!!%!!3!!!!`!"3!22rfN[(dC02F**%!#r2Yb6)H41E3
+!!3!5!!!!@J!J!!B"!*!%#3!!!!%!N"-)!!!!M!#3"5N#+!#3"5N#+!8S!r`!5!"
+)!!-!!3!!!!%!!3!"!!-!N!ErN!B!N!ErN!B!&3!!!!`!N!N"!!!'"J!"!!%!!!!
+-!!8!$crpT,ap'66h#54!![clFNb(N6Qd!!%!%J!!!&S!)!!'!3#3"!N!!!!"!*!
+53Am!#!#3$3Grrd!b!*!*#(rr3$)!N!N'Irp!-J#3#39rrd!b!*!*"(rr3$)!N!N
+"3!$!!*!+!N!"J!#3#J0!!D!!N2m!N)T"I`!)!*!0#(rr3$)!N!N(Irp!-J#3#3C
+rrd!b!*!*"Arr3$)!N!N%Irp!-J#3#3&!,3!!!!%G@J#3"3*!,3!!!!%GPJ#3"30
+!,3!!!!)5K!#3r`#3K8&r!!J!N!d)Irp!-J#3#3Grrd!b!*!*"Rrr3$)!N!N&Irp
+!-J#3#34rrd!b!*!*!F!Y!!!!&6Nl`!#3"!,!,3!!!"8j1kUV!!!!!m!Y!!!!&6N
+lP98!N2m!N)0"I`!"!*!-"H"!!!!J!*$r!*$X#!!!!)`!N!8T!LJ!N!8T!LJ&+!2
+m!%J!5!!$!!%!!!!"!!%!!3!$!*!'rj!'!*!'rj!'!"8!!!!-!*!*!3!!"J!!!3!
+"!!!!$!!&!!mrrD5mI4Ndp`NN3!,mqh*-Kj%jY!!"!")!!!"D!&X!"J%!!$B!#3!
+!!!%!N!B"%!!!!38!!!%-!!#UG`!!!3!!!!6P!!!$j3!!!)*38dNb39G%3J%!N!B
+#48!"!!X"8&0*-N&A4%-"!!KNBA4K,QGh-3!#!!!!@N4#8eT&3P)!N!aD4%*6@N9
+#8J#3'-qcH(X!!#+J!!!&Ce"656*"9e"'!3#3"J*23!%!#`&38dNb39G68`%!N!B
+#4N!"!!X"8&0*-N&A9e!"!*!'!N4!!3!,!9"656*%D@0d!3#3"J*33!%!#`&38dN
+b8e4%3J%!N!B#6%!"!!X"8&0*-P084%-"!*!'!Nj!!3#3""S!!3'[!M`!+!!b!#X
+!"3(D!N%!+`!&!GS#HJ!!!(J!!`!!!%J!5!#3"!,D!LMriIrL![N#4J0("5J$r!!
+#!!!!5!")!*!%!YS#+!!"!!!!C!!!!!%!!3%"!!!!!5F2!!%!!3#3$3)!'3'3!!#
+3"8!!N"`$!J"Jrj!)UP@U9DT9UP8!N!KrrrrrprrrrhrrprprrrIrGrrrrhIrrrp
+hrprrGrrprhIrhIphrphr9IrGreArhIp9rqlr9IqlreAr9Ip9reArGpehhAIGGpe
+9[eAr9IY9re@l9Ip9ZeAr9Ep9lPAl9Hj9ZeAZ9EY9lP@l9HT9Ze@Z9ET9Ue@k9DY
+9kP@U9Dj9UUS9UP@U8DT9UN@U9+T&UP5U4+S9UN5U8DT%UK'U4+S4UN#U%DS%UK'
+U4+S!UN5U!+T!UJ#U"+S!L#+))SJLL#+U!+S!UJ#U!+S!%3#U!%3!UJ!L!+S!)J#
+)!#)!L!!L!)J!)!#)!!)!L!!!!)J!!!#!!!J!J!!)!)!!!!!)!!!!L%3L%BK%)K%
+4)N5)%5*%L)"!)"!)"!)"!3)%#"!J3)$JF$JF$JH$`B-($K`iF1$"L%3L!)K%)J!
+4)N3!%5*%!)*%+"!S4))"QFaQ-jR-CM0hZphZGl[GlZlGZhIZhEYhIlrIlrIlrIl
+qrI[hlpqrIaq2aq2aq(`qq2(MaimI2RahZphrGl[GrqlGZrrZhE[rIE[AlpHlIIi
+cCXbC-fE-QDU3#-b3#)L3#2m!!!$r!!!!J*!)r`#3"`L!J!J)J)!)CJ!!!*N!!!$
+rL)L)riL)L2q!N!Ir!2m!r`$r!2rr!!$rr`!!Gj!)!2rrr`$rrrprN!J!rj!(php
+rprGrIrHCrrrrC[rrr`"hGhF!GhGh!(q3"r#3"!q3"*PQCTQCCQDC!!JF2Rmq(!J
+!#"3U95S8#,%`!a[B`!b0J"!#)!%)3!3)&#*"J!%#")$!)4)-"!)"ri#!J2m)#!J
+!Ihpr!2Ihpi"!)!!#"!J!JN3j4))"!3(iG#*(MaFLFEqJ[lfpr3Ap9D"!3&8+"!5
+)4#)4%5*%L)&#*"L"3L3BUJ#!!)J!J!!$K%J`$!)"!B#!36i)#"6M!*!,+!%"J!!
+!!!Cf-5i`,M%D8hPYB@jdC@-J4h*PBA4AEh*VFb"f-5i`,M%!!!!9&&0jE@&ZG'9
+M)%GbC@&d9fpbDh1U!!!"!!!!"18!!!2P!!!!JJ"EY%3C@!!!!"`!JJ!%9e"66J!
+!!#T38Nj8!!!!0P""9#-!!!"#GQ9bF`!!!%j69&)J!!!!@J!"rrm!N!9EXIJ!!Ir
+r!!!!(J"EXI3!!Irr!!!!QJ"EXI`!![rr!!!$S!"EXLLrp2rr!!!$c!"EXHccC`:
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/indeterminate/GreatWorks_DB_2.0.hqx b/writerperfect/qa/unit/data/calc/libmwaw/indeterminate/GreatWorks_DB_2.0.hqx
new file mode 100644
index 000000000..19caf5ef8
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/indeterminate/GreatWorks_DB_2.0.hqx
@@ -0,0 +1,222 @@
+(This file must be converted with BinHex 4.0)
+:#'4KG'%ZChFb!&T%3P0D48*5!3!!!#`!!!!3ZiX#!J"D4%*6!*!-+J!!!#S!!!!
+U!*!,"J!!!!B!!!!'!*!,#J!!!!S!!!!+!*!,$!!!!!`!N!3)!!!!#!!!!!J!N!F
+)!!!!#!!!!!J!!!!)!!)!!J!!)U!!!!1!!!!$S!!!!m!!!!2J!!!%!!!!"#!!N!B
+&`!)!!!!M`!!!"H!!!2q34(9bH5"6BfKXBQX)6Q9h)&P[FQX36faN)%9ZCfaTFfJ
+J9'9iG"02E'3J4@jRE'PcD#"8CAKd)%e8"%pZHAJ'6hKQEh*N#&"KE'&dD@j[$P0
+MFQP`G#"09#"#EfaN"90hD@jR"P0jE@*[E!K8C@aPG'9iG!98D@ePF`G89&P'Efj
+d$9TKF'BJ3fKKEQ0PFRN0@Q&`CL"%D@jRBQ&dF`4DC@&X"9C8-6!`!!!!#!!E!!J
+!@Yi)!!!!'`8j)("dF`)a-!)a-J)a0!)a1!)b0!)c0J)d1!!!!3!!!!Qq!!!)[J!
+!!Ui!9S+-'2S!!!!F!Ui!'d4TEQB!!!$L8e4C53!!!1j69&)M!!)!qP934%`!!`%
+H4&"$E`!+!!!!&!!!#!!!!!J!!!!)!*!*!CC%8%CK!!S!!!!8!!!D!!!!'J!!!"S
+!N!N"aP"cCA3!#J!!!"3!!"`!!!!F!!!!(!#3#3(f8(*Q-3!+!!!!&!!!(J!!!"i
+!!!!H!*!*!LC3FQBe!!J!!!$f!*!&+3)S!*!&+3)S"5J$r!")!%J!!`!"!!!!!3!
+!!!%!!$)X!*!'`F(rN!CJ"J#3"NcIrj!'9%m!!Iq3#!!$!*!*!3%P5J"R!!%b%L`
+"Z'B+JL`"ZF!"C`!")N(ZrmT$l!$m)0NJf8KZrmT)E[rF6Ud@JNKZ!!")E[r+,c`
+!!3!"6VVqE%kY!!%!!3!"!!!!#`!&!!irrDqJeAZd0H&(3!,YffVR(5&eZJ'Z!!!
+!&3!!!!`!N!N"!!!'5!!"!")!!!"D!!!!"J%!!*!!!!N!!!!"!*!&!rrr!!)!!!!
+-!!)!"!!!$J!!!",JhP!"!2rr!!!$J!"DhN`!!`!!!!3!!!!qhNJ"!2rr!!!%+J"
+DhN3"!2rr!!!%AJ!%!!!!"!!!!4)%rJ"DhM`"!2rr!!!&2J"DhMJ"!2rr!!8!!!!
+%!!!!![rr!!!&MJ"DhM!"!2rr!!!&Q!"DhL`!"J!!!!3!!!!#hLJ"!2rr!!!&TJ"
+DhL3"!2rr!!!&X!!(!*!%rrm!!!C'!&VH(!%!rrm!!!Cb!&VH'!)!rrm!r`!!!#3
+%G'pdE`"!!-!!N!G!,3!!!!%G@J!!`#d!!!!916[!!0i)"J#3&2m!!!!N"(4TG'N
+!3!'J!*!(3#d!!!!#%S3!!-!Y!!!!&6NlP98!N!S"6b8"EA"N)8&38%`!r`!!!%S
+U+'0[ER4KD@jc)$3JCQPPE'4c1L"dCAKd,fjeE@*PFLpNBA4P,h4TE@8Trhrr3$)
+!N!Crrd!b!*!'Irp!-J#3"R"bC@B%!*!-r`!!!&Jj+#"TEL"QD@9XC#!a1L"dEh4
+[,(4eG(8XG'PdD5XJG'KPFf8JCQPfC5"MEfeYC@jdFbFJE'PZCA-TIrp!-J#3"Rr
+r3$)!N!Crrd!b!*!*r`!!!$)6+'PZ)'CTC@aN)$)k)$-X0#`e+Arr3$)!N!Crrd!
+b!*!'Irp!-J#3"R"bC@B%!*!%$!!!!!J!!!%"!!i!CJ#3$Hm!N!81!!!!#!!#!!)
+!!3!"!9i"0!%+!1!!YJ#-!')!1!!13Am!#!#3$!4!!!!!!3!!&m!!!!!#!!!%J!!
+!!!-!!!6!!!!!"!!!"5!!!!!&!!!&J!!!!!B!!"J!N!3(!!!BB!!!!!J!N2m!N,0
+"I`!)!-)!N!JS)'PZ)'CTC@aN)$%k)(4[G'mXG(9dG5adDA4T+b"dD'9cC5"QDAC
+P)'0[E@ePER4c*b"XD@jPFbNSBfpZG'&TER-J0#"QD@9XC(-k)(4PH(3[ER9YBQ9
+b,f4KG'8[G'PYC5NSD@iJCQPPE'3J-MSJ-b`d,$8T+'PZ)'CTC@aN)$-k)$%[-5m
+d,$%[-c%[0#`a-Lma,cJj+5KTEL"QD@9XC#!d1L!c1M!`,#!d1M!`,#!e1M!`+A4
+TG'PdEh4[G(9dG3!jBhDBYVUq!!!!"3!!!!3!!!!'!!!!"`!!!!J!!!!$!!!!!3!
+!!!)!N+d%(UJ!N&K"I`!)!*!4!3#3"`)!N!F$!*!("!#3"`8!N!F'!*!("`#3"`J
+!N2m!N,0%!!!)!*!,!3!!!!)!!!!$!!!!"!!!!!8!!!!'!!!!"`!!!!J!N2m!N0B
+*!!!%c!"EX4J!!3T%BA4K)%9ZG(*jV3!$r03!$$Pm!!N!H$Pm!!%!HQ!B!!%!"3!
+"!!%!"!#3%!)R!!!!LJ!!!!S!!!!+!!!!#J!!!"m!!!!H!!!!(`!!!"i!!!!"!3#
+3#38S!r`!5!")!!-!!3!!!&ZaP!!)!*!%!3!!!`!!!%J!5!#3"!,D!LMriIrL![N
+#4J0("5J$r!!#!!!!5!")!*!%!YS#+!!"!!!!C!!!!!%!!3%"!!!!!5F2!!%!!3#
+3$3)!'3'3!!#3"8!!N"`"Y!!!!+!!!!!%!!!!&!!)!$B"!!!@!!!!,3!!!#3!!!"
+%!!!!!3!!!!%!!!!h!*!%!3#3&3S!!"3!!!"*!!!!*3!!!4%!!!!#!!!!!J!!!"`
+!N!3"!*!9!3!!-3!!!"3!!!!r!!!!4!!!!!%!!!!$!!!!13#3"!%!N"8+!!![!!!
+!53!!!%!!!!%4!!!!!J!!!!3!!!!F!*!%!3#3&3%!!%`!!!!S!!!!@J!!!%3!!!!
+"!!!!"3!!!$F!N!3"!*!9#J!!5J!!!%N!!!"E!!!"%3!!!!)!!!!'!!!!(!#3"!%
+!N"8"!!"R!!!!+3!!!(8!!!"%!!!!!3!!!!F!!!!h!*!%!3#3&3S!!'8!!!"*!!!
+!GJ!!!4%!!!!#!!!!#!!!!"`!N!3"!*!@!`!d!!3!!3!!!!%!N"VrN!B!N!ErN!B
+!"!!"!!!!!3!!!!(rN!J!N!lrN!B!N!ErN!B!!!!"!!!!!3!!!3(rN!J!N!lrN!B
+!N!ErN!B!!!!H!!J!!J!"!!)!!`!%!!8!"J!(!!J!"!!%!!!!!3#3"48!!!!-!*!
+)&!)!N!B#!3!9!!%!$!#3"[q3#J!!!!)!C`!!!#N!!!"e!!!!4!!!"(4TE@8!!`!
+$!!!!!3#3"48!!!!-!*!)#J)!N!B#!3!9!!%!$!#3"[q3#J!!!!)!6!!!!#J!!!"
+D!!!!4!!!"'4KG'8!!J!#!!!!!3#3"48!!!!-!*!(!J!#!*!'!J%!&3!"!!`!N!E
+rN!S!!!!#!$%!!!!8!!!!2`!!!%3!!!CZG@eLCA)!!3!"!!!!!3#3"48!!!!-!*!
+*!J#3"J)"!"8!!3!-!*!'rj!+!!!!!J!@!!!!,3!!!#3!!!"%!!!%G'9iG$!-J+)
+`@!#M-+3!T$$`!!N!!!6-!&Za)!!$#%0[E(9YEQ&b!*!(J!!!$!!#LN!!!!!#K3!
+!E!!"!#%!!3!#!!-!N"!#*`!!!"8!!!!8!!!!#J!!!!S!!!!I!!!!(J!!!"m!!!!
+H!!!!!3%"!*!)"5J$r!")!%J!!`!"!!!!@l'-!!J!N!3"!!!$!!!!5!")!*!%!YS
+#+2rKrq)#q3*'!dF&+!2m!!)!!!")!%J!N!3#fJ)S!!%!!!"N!!!!!3!"!3%!!!!
+"*`m!!3!"!*!0!J!C!C!!!*!&3!#3(!'d!!!!S!!!!!3!!!!8!!J!0J%!!!3!!!!
+"!!!!%J!!!"J!!!!"!!!!!3!!!$F!N!3"!*!9#J!!&3!!!!%!!!!Q!!!!K`!!!!)
+!!!!#!!!!(!#3"!%!N"8"!!!%!!!!LJ!!!")!!!#k!!!!!3!!!!-!!!!j!*!%!3#
+3&3S!!"8!!!#+!!!!*J!!!4!!!!!#!!!!"!!!!"`!N!3"!*!9!3!!"!!!!4-!!!!
+5!!!",`!!!!%!!!!&!!!!0`#3"!%!N"8+!!!9!!!"%`!!!#B!!!'C!!!!!J!!!!B
+!!!!F!*!%!3#3&3%!!!3!!!'F!!!!%J!!!EF!!!!"!!!!"`!!!$F!N!3"!*!9#J!
+!&3!!!C`!!!!Q!!!#)J!!!!)!!!!)!!!!(!#3"!%!N"B$!$3!"!!"!!!!!3#3'[q
+3"J#3"[q3"J!%!!%!!!!"!!!!!Iq3#!#3$[q3"J#3"[q3"J!!!!%!!!!"!!!"!Iq
+3#!#3$[q3"J#3"[q3"J!!!"i!#!!#!!%!!J!$!!3!"3!'!!F!#!!%!!3!!!!"!*!
+&&3!!!!`!N!J8!J#3"J)"!"8!!3!-!*!'rrm!N!ErN!3!!!!%!!!"R!!!!")!!!'
+h!!!%G'PYC3!$!!-!!!!"!*!&&3!!!!`!N!J+!J#3"J)"!"8!!3!-!*!'rrm!N!E
+rN!3!!!!%!!!"%`!!!")!!!%[!!!%C'&dC3!#!!)!!!!"!*!&&3!!!!`!N!F#!!)
+!N!B#!3!9!!%!$!#3"[rr!*!'rj!%!!!!"!!!!)S!!!!5!!!!ZJ!!"QjeE@*PFJ!
+"!!%!!!!"!*!&&3!!!!`!N!N#!*!'!J%!&3!"!!`!N!Err`#3"[q3"!!!!!3!!!!
+"!!!!%J!!!"J!!!4dCAKd!*!2r`!!!#3%G(9dG3"!!B!!N!G!,3!!!!%GPJ!!`#d
+!!!!916ZUUf9b!*!9r`!!!%)L+'PZ)'CTC@aN)$-k)$%[-5md,$%[-c%[0#`a-Lm
+a,cJj+3"rrd!b!*!'Irp!-J#3"Rrr3$)!N"rr!!!!2KiSD@iJCQPPE'3J0$SJ-cS
+`-#`J0$S`-#`J06S`-#N!Irp!-J#3"Rrr3$)!N!Crrd!b!*!M#!!!!)`!N!8T!LJ
+!N!8T!LJ&+!2m!%J!5!!$!!%!!!!"!!%!!3!$!*!'rj!'!*!'rj!'!"8!!!!-!*!
+*!3!!"JB!!3!"!!!!$!!&!!mrrD5mI4Ndp`NN3!,mqh*-Kj%jY!!"!")!!!"D!#!
+!"J%!N!3*!!!!!3#3%`J!!!#-!*!&+3)S!*!&+3)S"5J$r!")!%J!!`!"!!!!!3!
+"!!%!!`#3"[q3"J#3"[q3"J!9!!!!$!#3#3%!!!B'!!%!!3!!!!`!"3!22rfN[(d
+C02F**%!#r2Yb6)H41E3!!3!5!!!!@J!J!!B"!*!%#3!!!!%!N"*"I`!)!*!0"hr
+r3$)!N!N)Irp!-J#3#3Crrd!b!*!*"Arr3$)!N!N%Irp!-J#3#3&!!-!!N!S#3!'
+!!*!+!d!"S!#3r`#3LN&r!!J!N!d)Irp!-J#3#3Grrd!b!*!*"Rrr3$)!N!N&Irp
+!-J#3#34rrd!b!*!*!8!Y!!!!!4eD!*!&!N!Y!!!!!4f@!*!&!d!Y!!!!!K+%!*$
+r!*#&3Am!#!#3$3Krrd!b!*!*"hrr3$)!N!N'Irp!-J#3#39rrd!b!*!*"(rr3$)
+!N!N"`#d!!!!916[!!*!%!X!Y!!!!&6NlUUX!!!!$`#d!!!!916Z993#3r`#3K!J
+!!!$f!*!&+3)S!*!&+3)S"5J$r!")!%J!!`!"!!!!!3!!!!%!!$)X!*!'`F(rN!C
+J"J#3"NcIrj!'9%m!!Iq3#!!$!*!*!3%P5J"R!!%b%L`"Z'B+JL`"ZF!"C`!")N(
+ZrmT$l!$m)0NJf8KZrmT)E[rF6Ud@JNKZ!!")E[r+,c`!!3!"6VVqE%kY!!%!!3!
+"!!!!#`!&!!irrDqJeAZd0H&(3!,YffVR(5&eZJ'Z!!!!&3!!!!`!N!N"!!!'X!!
+"!")!!!"D!!!!"J%!!*!!!!N!!!!"!*!*#!!!!2B!N!8T!LJ!N!8T!LJ&+!2m!%J
+!5!!$!!%!!!!"!!!!!3!!-L`!N!E"`Iq3"Q!'!*!'60rrN!C86`!"rj!)!!-!N!N
+"!59+!'F!!6)5,!'iCJU#,!'j`!&R!!%L3HlrbN2X!2`Jf5$C5'lrbNKZrpa1V4D
+#5'i!!%KZrmS[2!!"!!&1Z[jX6Ud!!3!"!!%!!!!,!!8!$MrpVk$9Hl3ei8G!!Zh
+EDZFG)A@k!Di!AJ!9!!!!$!#3#3%!!!CJ!!%!%J!!!&S!BJ!'!3!!bJ!*!!!!!3#
+3#3J!!!#-!*!&+3)S!*!&+3)S"5J$r!")!%J!!`!"!!!!!3!"!!%!!`#3"[q3"J#
+3"[q3"J!9!!!!$!#3#3%!!!B!!!%!!3!!!!`!"3!22rfN[(dC02F**%!#r2Yb6)H
+41E3!!3!5!!!!@J"E!!B"!!!f!!N!!!!"!*!'!4!!!!%&!!!"$!!!!!%!!!$m!!3
+!2J!(!!8!!3%"!!!!A!#3$J)!!!%%G'9iG!haa!"S[b)!D,mN!"MGMJ!!rj!%!!%
+!N!8&!!8!!3%"!!!!A!#3$J)J!!)'ER9YBQ9ba!"S[b)!D,mN!"MGMJ!!rj!%!!%
+!N!8*!!8!!3%"!!!!A!#3$J*!!!-%C'&dC3haa!"S[b)!D,mN!"MGMJ!!rj!%!!%
+!N!8+!!8!!3%"!!!!A!#3$J*J!!3%G'PYC3haa!"S[b)!D,mN!"MGMJ!!rj!%!!%
+!N#-0!!!"(!!%!%B!N!N"!!!!!@+B!!!!p%#!l%)!N!5J*!!!!23!N!KJAR&F!'L
+0V!"LZGJ!AQ+B!!-G"N#!jC!!3)$LH!#3#3%!!!!"BTJ!!!$d3)$X3J#3"+!N!!!
+!p!#3#'"HF9`!D)fX!'+jf!"HBTJ!!ad'3)$PN!"!J1*i!*!*!3!!!!&LQ!!!!24
+!J1a#!*!%S#3!!!$d!*!)B&jaA!"SMD`!BVRB!&jLQ!!$(3C!J1@3!%#!iRJ!N!N
+"!!!!!@+B!!!!p%#!l%)!N!5J*!!!!23!N!KJAR&F!'L0V!"LZGJ!AQ+B!!-G"N#
+!jC!!3)$LH2q3(J!)!!!!pJ#3"5N#+!#3"5N#+!8S!r`!5!")!!-!!3!!!!%!!!!
+"!!!b,!#3"X("rj!'B!B!N!C-hrq3"P42!!(rN!J!!`#3#3%"*8S!C`!"-K)X!EK
+Q#S)X!ER!!@F!!5*"l[r+3q`!r#$C)0P)E[r+5'lrh%kY&S*)EJ!!5'lrbLmm!!%
+!!8kkrQa1V3!"!!%!!3!!!!X!"3!12rf[S09lY$AK4d!#lGYUjadKGES"VJ!!!"8
+!!!!-!*!*!3!!"JJ!!3!5!!!!@J!!!!B"!!#3!!!*!!!!!3#3"2q3"!!)!!!!pJ#
+3"5N#+!#3"5N#+!8S!r`!5!")!!-!!3!!!!%!!!!"!!!b,!#3"X("rj!'B!B!N!C
+-hrq3"P42!!(rN!J!!`#3#3%"*8S!C`!"-K)X!EKQ#S)X!ER!!@F!!5*"l[r+3q`
+!r#$C)0P)E[r+5'lrh%kY&S*)EJ!!5'lrbLmm!!%!!8kkrQa1V3!"!!%!!3!!!!X
+!"3!12rf[S09lY$AK4d!#lGYUjadKGES"VJ"S!"8!!!!-!*!*!3!!"PJ!!3!5!!!
+!@J!!!!B"!!$S!!N!!!!"!*!%2!!3+`!)!!!!pJ#3"5N#+!#3"5N#+!8S!r`!5!"
+)!!-!!3!!!!%!!!!"!!!b,!#3"X("rj!'B!B!N!C-hrq3"P42!!(rN!J!!`#3#3%
+"*8S!C`!"-K)X!EKQ#S)X!ER!!@F!!5*"l[r+3q`!r#$C)0P)E[r+5'lrh%kY&S*
+)EJ!!5'lrbLmm!!%!!8kkrQa1V3!"!!%!!3!!!!X!"3!12rf[S09lY$AK4d!#lGY
+UjadKGES"VJ"H!"8!!!!-!*!*!3!!"Q!!!3!5!!!!@J"I!!B"!!$b!!N!!!!"!*!
+&N!"+V%&r!*!-rq!JEG1i,8Mrj#"Ydl3J8#e)rq!JE[rNF!5`D!!H9m!JE[rJ5QJ
+!APl"`!&R*N+R6VVjK#"I3qlrm%(S!&3Lf#,B)YJLf%KZrr")E[rS6Ud%UQ!)5'l
+rk%kY!@)JEJ!)3qlrk#$C)0P1ANje6PErq%MR!4JQEJ!)3QG1Z[mf-"p)`#i!+'h
+6Z(!%X'`!(QBL,b`!N!!["dkY$NSQPbm(6Ud13L!X!*!!N!#I)'i!$##!8T0J$(!
+"*S!JEJ!-)+`!N!"-haL!6PiJAe"26Y"19[rm51F$'#CZ!!`X,J!3+'h6Z(!%X'`
+!(QF))%BJV!#!B!a`!5P!!)!J4L#X!)"`!l"X!"jA`()%XQ`!(PI"J!&R(L"')#`
+!K0#3!&1!*S!JEG1d)&!Z+!"@[T0X##D(B!4`!5D!60mB`%jH)&rHr!!-6Y"19J!
+!,`a#Tdkkq'iSAc!Z!!K63'F18d"R%P0!CaC63'FDB"iGE!"R!!TJ&Kem!!%!#Q!
+1(@`!D!!+B!BGE!"T!!SSAdjH)&p86dl36PErr#m-+'h6Z$!X!#53!'`!)%M!d+`
+!L#m!,c`!!(rr6Ud15L!I8S!j3!#FEJBjI!!"!*`jE!#@!*S[,!#3!$!X!*a)`#m
+!6Ud15L!I18!!Q#KI6Pj1G8j@+&p1ANje6PBSAdjH6R919N&r!!%!N!`S!%!!!J$
+qmNkkr4CJ"Lm(6VVll%cI!-"1AL"I9%p1d%j@rrK)j`%)3UG1Z['!+&p`!E"8CJ4
+q!@!#IJ"1Z[UZ,`G1Z[[H60m3J%jH6R919[ri51F"#%+R6VVa8LKIIJ"`$l"8CJT
+`!l#X!!*R!Ri"6VVkHLm(6VVlUNcI%)"1ANje6PErq%MR!3K#Tdkkm4iSAh!2X&4
+Q"(i"B!*q!%kkqN`["dkkqha-ha#!6Pj1G8j@rrK)j`%)3UG1Z[$`+&p`#,"8CJ4
+q!@!#IJ"1Z[SH,`G1Z[Y160m3J%jH6R919[ri51F"#%+R6VV``LKIIJ"`$l"8CJT
+`!l#X!!*Q!Ri"6VVjkLm(6VVl'NcI%)"1ANje6PErq%MR!3K#Tdkkm)iSAh!(X&4
+R"(i"B!*q!%kkqE`["dkkqZa-ha#!6Pj1G8j@rrK)j`%B3UG1Z["J*PmS5h!#X&4
+I`()'XP4F`F!"C`4q!@!#IJ"1Z[Q#,`G1Z[Ub60mBJ%jH6R919[ri51F"#%KZrra
+#Cdkkq,3SE[rmF"#`9'B%IJ&J&R!JX&4Q"(i"B!a`)E"8CJ4q!@!#IJ"1Z[Nk,`G
+1Z[TU60m3J%jH6R919[ri51F"#%+R6VV[hLKIF!H`9'B%IJ&J!Ri!6VVj$#m(6VV
+k22N-,`G1Z[SmD$`!!!%!!!!2e3!!$Y8!!!$Q8&0*-N&A4%)"!*!'!N9!!3!,!9"
+656*"9d4$!3!)C'&dB5jRGc)J!J!!!&T%3P0D48*5!3!!3!!3!*!'@N4#8eT&3P)
+"!!"!!"!!N",2XhKl!!!U!!!!%,Y38dNb39G34J%!N!B#6d!"!!X"8&0*-N&A8e-
+"!*!'!NC!!3!,!9"656*"9eG3!3#3"J*%3!%!#`&38dNb4'PMG!%!N!B#8%!"!!X
+"8&0*-P084%)"!*!'!Na!!3!,!9"656*69%4$!3#3"J*13!%!N!3D!!%"V`)m!#J
+!-J!S!$)"e`*Z!#X!"3(D!RS!!!"i!!-!!!")!%J!N!3#fJ)Srq(riJ,j!NB$4`8
+S!r`!!J!!!%J!5!#3"!,D!LJ!!3!!!'3!!!!"!!%"!3!!!!%R$`!"!!%!N!d#!"N
+"N!!!N!9!!*!F!`)!B2q3#+T9UP@U9DT9!*!)IrrrrrIrrrprrrIrIrrhrhIrrrp
+hrrrrGrrIrhIrrIphrphrGrrGreArhIp9rphr9IrZreArZrp9reAr9Ip9rhIGGpe
+hhAIG9Ep9reAl9Ip9ZeAr9EY9re@r9Hj9qeAZ9EY9lP@l9Hj9ZeAU9EY9VP@k9DY
+9ZP@V9HT9UP@Z9DUU&DT9UP'U9DT&UP5U4DT8UN5U&DT%UP'U4+S4UN5U%DT!UK'
+U"+S4UN5U!+T%UJ#U3+S!UJ5U!)JLL#+))SJLUJ#U!+S!UJ#U!"%!UJ"%!+S!)J#
+U!#)!L!!L!)J!)J#)!#!!L!!#!)J!!!#)!!!!J!!)!)!!#!#!!!!!#!!!!)K%)K'
+)4#)4%5*%L"%L4)L!3#!3#!3#!3%#"!J3)%#!i(!i(!i(Jm'$"`iF1($J`BK%)J#
+)4#)!%5*%!"%L4!##4#J3+%5#!CR-CM1Cc'BcGl[GlRHlhHlZhEYhlYflGhqrhqr
+hqrhqr[hlpqrI[hmIMmIMmIKm2[MaimH2(cjmGl[GrhHlhIrZhE[rlYflrhfleqr
+AZhhq-fE-Q60Qc*QUN!M-N!L)N!Mr!!!!r`!!!)#3#2m!N!F)J)!)#)#!#'B!!!#
+C!!!!riL)L2q)L)MrJ*!(r`$r!2m!r`$rr`!!rrm!!(H3#!$rrrm!rrrrIj!)!2q
+3"rGrIrIhIhrhQIrrrfErrrm!GhGh!(GhG`"rN!I`N!32N!5CCQDCQ@CQQ3!)($j
+r2K`)!!J8+P8U&!La-!-Ef-!-MB!3!L!"#%!%#"3L3B!"!J5!`#%5$!3#!Iq!J)$
+r#!J)!(prI`$hprH!3#!!!J3)!)*%185#!3%"q(3L4imA)R'rS,qp[Id&r9@J3%"
+9#J3%L%3L%4%L4)L"3L3BJ8)N'+S!J!#)!)!!!i4)-!`#!3'!J%%q#!J8i`#3#bJ
+#!)!!!!-'GM)Z-#ia'P0jE@&ZG'9M)%GbC@&d9fpbDh-JGM)Z-#ia!!!!&446H@e
+KER4PBb"(FQ9KG&G[FQYcUJ!!"Q3!!J!)rj!'r2ccm`8&rrpNC!)#hGd)#!B'm[)
+)#)5%4NB!!+@P!*!%e03#!UZVkZSI(lHh&"3!!'4N%4&@9L`X"3@3!*!!FA%k1X#
+3"S#3"N#3"J#3"[q3#Xc-rj!%QCRrN!4QC[q3"$-crj!%!!$rrmc-rj!%c*!%rrr
+-c*QCrrr-c'CQrrr-c$-crrr-c!!!rrqCQIq3"*QCc-crrjQ3"2rrQCPQC[rrQCN
+c-rrrQCN!!2rrCQErN!4QCXc-rrpQCTQCrrpQN!6rrfCQ-c2rrfCQ!!$rrc-crj!
+%-c2-c2rr-c1CQIrr-c0QC[rr-j!%rrmc-`!!rrm!!2q3"!!!c-crr`!!QCRrr`!
+!CQErr`!!-c2rr`#3"-c-rj!%c-crrmb3"2rrQCR-c2rrCQE-c2rr-c2-c2rr!!$
+-N!6rrmb3#TQCc*!%CQE-N!3c-mb3"!!!c-bCQIrrc-bCQFb3"*Q3"-c-QCPQCXc
+-QCNc-mc-QCN!!-c-CQErrmc-CQE-N!4QCTQCc-aQN!6-c'CQ-c2-c'CQ!!$-c$-
+crrr-c$-cc*!%-c1CQFc--c0QCXc--j!%c-`c-`!!c-`!!2rrc-`!!-b3"!!!QCR
+-c!!!CQE-c!!!-c2-c!#3"*QCrj!%QCRrrmc-QCRrrjQ3"2rrCQDCQIrr-c1CQIr
+r!!#CQFc-rrqCQFb3"*QCc-bCN!6-c'CQQCR-c$-cQCR-c!!!QC!%rrqCN!6-c*Q
+3#QCQQC!%-c1CN!3!!*QCCQErrjQCCQE-c*QCCQDCN!4QN!5CQ@CQ-c1CQ@CQ!!#
+CQ6-crrqCQ6-cc-bCQ6-cQC!%-c0QCTQC-j!%QCNc-`!!QCN!!2rrQCN!!-c-QCN
+!!*Q3"!!!CQDCQ3!!-c1CQ3#3"'CQrj!%CQErrmc-CQErrjQCCQErrfD3"2rr-c0
+QC[rr!!"QCXc-rrpQCXb3"'CQc-bCQ@CQc-aQN!6-c$-cCQE-c!!!CQDCQIrrCQD
+CQFc-CQDCN!4QCTQCCT!%QCNc-fCQQCN!!'D3"2rrCT!%c-aQN!5CQ@D3#M-cCT!
+%!!"QCM-crrpQCM-cc-aQCM-cQCPQCM-cCT!%-j!%CQBc-`!!CQB!!2rrCQB!!-c
+-CQB!!*QCCQB!!'D3"!!!-c0QCJ#3"$-crj!%-c2rrmc--c2rrjQC-c2rrfCQ-c2
+rrc13"2rr!!!c-mc-rrmc-mb3"$-cc-bCQ6-cc-aQCM-cc-`cN!6-c!!!-c1CQIr
+r-c1CQFc--c1CN!3c-jQCCQBc-jQC-j!%QCN!!$-cCQErrc-cCQE-c$-cCQDCQ6-
+cCT!%-c0QCM13"'CQ!!!cN!6rrc13"-c--j!%QCNcN!4QCM13#J!!-c-!!2rr-c-
+!!-c--c-!!*QC-c-!!'CQ-c-!!$13"!#3"[q3"!!!rrr-c!!!rrqCQ3!!rrpQCJ!
+!rrmc-`!!rrm!N!6-c2rr!!$-N!3!!-c-QCN!!-c-CQB!!-c--c-!!-c-!*!%QCR
+rr`!!QCR-c!!!QC!%!!#CQ@CQ!!#CQ6-c!!#CQ3#3"'CQrrm!!'CQc-`!!'CQQCN
+!!'D3"!!!CQBc-`!!CQB!N!3c-rrr!!!c-mc-!!!c-jQC!!!c-fCQ!!!cN!3!!$-
+c!*!'rrm!N!6-c!#3"*QC!*!%CQB!N!3c-qlZ!*!%hGd!N!5lZ`#3"+UU!*!%L)J
+!N!4hG`#3"&99!*!%4%3!N!3L)J#3""%4!*!'lZi!N!6Gh3#3",Zl!*!%UUS!N!5
+)L!#3"(Gh!*!%998!N!4%4!#3"#)L!*!%%4%!N!EZlJ#3"0hG!*!%ZlX!N!5UUJ#
+3")L)!*!%GhF!N!4993#3"%4%!*!%)L)!N!34%Hk3"Yf3"VZ3"UU3"SL3"RH3"P@
+3"N53"L+3"K'3"J#3#33!N!B"!!!"rj!'!*!*!Iq3"J#3"bd!!Iq3"J#3"eS!!Iq
+3"J#3"iF!!Iq3"J#3"l3!!Iq3"J#3"q%!!Iq3"J#3"J%1!!(rN!B!N!B"1`!$rj!
+'!*!*!`#3"[q3"J!!!!,rN!B!N!N#rj!'!*!(Y!!"lZi!N!5)L!#3"`%!!1lZ!*!
+%998!N!8"!*!%rrm!N!5)L!!!!!(rN!6-c2q3"!#3"J(d!!)!#3!!!!5!!*!K"U3
+!!1!9rrm!!J!*!!!!#3!!rrm!!ZXq!*!%i"Irr`!#lF)!N!6J'2rr!!,Z63#3"FA
+rr`!#!!3!5!!!!!5!!!!*!!!!")!!!'Arr`!#9#X!N!9Qrrm!!P4c!*!&D2rr!!*
+9,3!#!!5!!!!%J!"9T`#3"Arrr`!#9E%!N!9prrr%!P@j!!#2j!!!rrr!!PBB!!!
+!"J")!!!!")!!!!N!!!!%J!!!#3!!!!5!!!$(rrm!!QrR!*!&DIrr!!,`JJ#3"3)
+!%J!!!!5!!*!%Drrr!!,`p!#3"@hrr`!#mCS!N!6J!2rr!!*6E!#3"3%!"J!5!!!
+!")!!!!%!!!!%J!!!!3!!!!5!!!!#8kF!N!6`!2rr!!-*-J#3"2!"rrm!"!!*!!!
+!")!!!!%!!!!%J!!!!2!&rrm!!`PM!*!%i"rrrb!$#Ad!N!6J"[rr)!-!"J!*!!!
+!")!!!!N!!!!%J!!!!3!!!!5!!*!&i#,rr`!$#Td!N!6J"2rr!!-+V3!#!!%!!!!
+%J!!+``#3"1!$rrm!!`V6!*!%m!Err`!$#bF!N!6`"rrr!!-,T!#3"!'!!!%!!!!
+,!!8!$MrpVk$9Hl3ei8G!!ZhEDZFG)A@k!Di!!J!!!!X!"3!12rf[S09lY$AK4d!
+#lGYUjadKGES"0!!'!!!!#`!&!!irrDqJeAZd0H&(3!,YffVR(5&eZJ(Z!!8!!!!
+,!!8!$MrpVk$9Hl3ei8G!!ZhEDZFG)A@k!3)!"!!!!!X!"3!12rf[S09lY$AK4d!
+#lGYUjadKGES"!!!"!!!!#`!&!!irrDqJeAZd0H&(3!,YffVR(5&eZJ$Z!!)!!!!
+,!!8!$MrpVk$9Hl3ei8G!!ZhEDZFG)A@k!2`!"J!!!!X!"3!12rf[S09lY$AK4d!
+#lGYUjadKGES!,J!&!!!!#`!&!!irrDqJeAZd0H&(3!,YffVR(5&eZJ$b!!3!!!!
+,!!8!$MrpVk$9Hl3ei8G!!ZhEDZFG)A@k!&B!!`!!!!X!"3!12rf[S09lY$AK4d!
+#lGYUjadKGES!#!!$!!!!#`!%!"%rr1bM##J4R&NN3!1,YXK)Bme$j3"@!!!"!!!
+!$p8!!!l9!!!!jJ"DS-`BqJ!!!"`!jJ!*9e"66J!!!&*38Nj8!!!!AP""9#-!!!"
+UGQ9bF`!!!(C69&)J!!!!JP"X9&3!!!#16RK&C!!!!*T(FN46!!!!TN4K5&-!!!#
+b39*5F`!!!,i!!Irr!*!&AQ"J!!(rr`!!!"i!AQ"N!!(rr`!!!*S!AQ"3!!,rr`!
+!!k!!AQ"![r6rr`!!!m`!AQ!8!!(rr`!!!q8!AQ"S!!(rr`!!#Nd!AQ"X!!(rr`!
+!#P8!AQ"`!!(rr`!!#eN!AQ"%!!(rr`!!$9%!AQ!mZ4B!:
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/pass/BeagleWorks_1.0.hqx b/writerperfect/qa/unit/data/calc/libmwaw/pass/BeagleWorks_1.0.hqx
new file mode 100644
index 000000000..fa49d2116
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/pass/BeagleWorks_1.0.hqx
@@ -0,0 +1,45 @@
+(This file must be converted with BinHex 4.0)
+:#(0SC@9d,Q*h!%*AFh0#9fYc!3!!!!H!!!!"BQUN3PGVFd*AFh0#9h0c!*!&!3#
+3"`%!N!B""`#3"!@-!!N!!!!*!*!-!3#3"!F!!3!2!!!!5!")!*!%![!#32rarqi
+$#3*5B`)&+!2m!3!!!!&S!@J!N!31X!Y!!!%"!!"N!!%!!!!"!!)!!!!"*`m!!3#
+3$K!!N!N3!2qerkB2,3ZD!!J"!*!0'3%!!!%(!*!)!3F!N$J'4f9ZCACK!#i!#R"
+bC@B!N!G6ZA!!8lYJ!!!""!-#!J%"!3!"!!S!!!!K!!-!"`!0!!-!Q!)Q!!&NEh0
+e#@%!N!96ZA!!8lYJ!!!!5!!!!%J!!!")!!!!5!%"!3!#*QCZ!!JJ$'B3F$![!%k
+Y"0SS3#!-@%pR4#m-6Ud!1LK!)&3JVH5S)%bJ+5"83QJ!"#"83QJ!"L"83QJ!##"
+8F!!K3!!+)&4)D!!12c`$kA!22`"1V30b)%bJ+PK2)!`SE[rm6Pj1G8j@!!![$#K
+Z!!JJ$'F`)&3JVH5S)&3r+!!%UCSJ$'FHF!![!#m-6Ud!3L!Z!!`)!!!!8%pR##m
+-6Ud%iPK2+'lrr%jH6R919[rk51F"'#KZ!!JJ6+!T9Bmr2)!!,ca`FQ9QF!%I!%K
+ZrrT)E[rm6Ud$-MiICQC9McmZrrS[,[rm)&4)D!!1,ca#9fYc,ca6G'&h6Ud#kMi
+I"e"KCf8J*R!J9%KS!!j1V3-U9Bmr,[rk,blrr#"85'J!$R!$(`"1V3-L)&3aA`!
+%)&3aE[rk!!JJ9#&Zrr`!#Q!!!+*`HU-H*NJ[#dkY#D)J9%(S!!iR5!!5)&3RD!!
++!$!J9$GS!!J!&P@2,`Y`!"m!6Ud#BNkY#E*`!F!V!"jb!")!5S&R*P@2)&3r+!!
+),bJ!#NKS!!j1V3-+F!X[!%Ki!qY1V4656qm!#Q!85QX!''F1F!X[!%Ki!qY1V46
+58%mJ5k!I9BmJ9$mS!!J[+!!+5'J!$R!$(`"1V3-L)&3aA`!%)%bJ+NcZ')$rlNj
+H6R919[rm51F('#CZ!!`SEJ!"!!p!!!%!N!3(!!Mrr`#3#'S!!2rrm+SJ8$&mrqm
+!!`!&!'S1)2#U)P%M5!%!EQpbE@&X$#!!#J!$#!!!Ff*[E'31)!!+!!-3!!"cDA4
+KE'PM%5!!#J!$)!!!Fh9ZC'9bE'PZC@J!!")Jm+SJ8$&mr`"LD@FJBfpXG@eZ!!%
+!!!"N!!!!&cmmJ!![2("L!!8!"!"N#b!!#J!$!J!!Fh*PC"m0)!!+!!-$!!"cCh*
+PC@jS$#!!#J!$"!!!Ff*XG@84)!!5!!-!!!"c-6JJF'pTER4c$JmJ!!S!&J!!!(0
+MEh9bD@9bD!!#!!!!8!!!rrm!8lP`!(-!"3!$!!-!8!dJ!*!)B@aTCfi!$#!!#J!
+$!!!!%faPCR31)!!+!!-!!!"6Bf9ZG'9b$5!!#J!$!!!!-h*TCfKd%!!$!!!!-J!
+!rrm!8lP`!)!!"3!$!!!!-KiJ!*!)FfpYC5"ZG@eLCA*TEQFJCQpbE@&dF`!%!!!
+!LJ!!rrm!N!B"#J!$!!8!LK)3!'ITLJ"6Z3!rr-b3#")3!!S!!`!L!(-rr-b3#")
+3!!S!!`"!!(-rr-b3#")3!!S!!`"J!(-rr-b3#")3!!S!!`##!(-rr-b3#")3!!S
+!!`#+!(-rr-b3#!!&!!!!0J!!rrm!N!B""!!$!!!!0L%J!*!%Irpr!(0[E@8JC'&
+dC5"[FL"dD@eP)'C[FQeKG(-!!!B!!!"X!!$rr`#3"[a%!!-!"!"X%K!!#J!$!+!
+!Fd!0R%!!N!B5%!!+!!-!`!"c3!hUB!#3"K)3!!S!!`$"!(0!$Ta!!*!'%K!!#J!
+$!-3!FcrqJ!#3"`JL!!S!!`$(!(-!"`!!!#J!!2rr!!!!$!!"r#3!!`!!!#J8)!!
+"r%acEfd!FfpYC5"QEh*YG@aK!!J!!!"Q!!$rr`!!!!`#C3!!!!-!!`"Q$k!!0!#
+3"!%!!!"KBQ0NC3!8N!!!!!!U!Q9r!!!"2rq!!*!(&*!!Irm"I`#3"3)rrUU3"kX
+8N!!!F`!!!$`!!!!$2rr99C!'9J!"!#m#!!8!!!!1!!!!5`"'!!!!!J!X!*!&5`"
+'!!!!!J!X!!%!!3"I!%B!!!!#!#`!!J!!!%X!4J!!!!)!,!!$!!!!5`"'!!!!!J!
+X!!3!!3#6!%B!!!!#!#`!"3!"!!8#!!J!!!!+"JCKBQ0NC3!$!!!)!!%!"`8!!!!
+"!f8!#!!#!"-&!!!!!J8!!!!$$J(rri!!$3-!!!J!!`!0![rqJ!$rri!!@3%$rd!
+!3!!"!3!"!3#3#3N!!`!+!!3!#3!$kV-!!!%!!!!"(!!!!"`!!!"'!#e!rkJp4[q
+X3HlrM(!(SQ!q!#"Z!!`JV[qm-!G-lK!++R0SC@9d,Q*h-!!#!!!!3PGcFd*ADh-
+!N!T#9h0c3PGVF`#3'-qb*Di!N!B"BJ8Z!&+(B"`J"J+!!!!!$dL!'E-!!(J!)!C
+b%%kY!r)X!&1(F!'`KfhH61iBk2r@6Pj1G6!a-M-d06Bh1$P"3N0%48B!!%j@rra
+)j`-B*Qi!$$`Z!")JEJ!)3K!S8e4-IJ&J$(!!%"4530M!)!G5KdM'[)GZlPQ2,`a
+1V30kF!!3&0!!!!!)!%i!!J(F!RB!!!!-#d*PB@GXC9G[FQYc!!!"!!!!!4`!!!!
+F!!!!4J"6[$JD&!!!!"`!4J!"Ge"[F`!!!"*69&)J!!!!(J2Trrm!N!Lrp2rr!!!
+!$!#3"#5m:
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/pass/BeagleWorks_DB_1.0.hqx b/writerperfect/qa/unit/data/calc/libmwaw/pass/BeagleWorks_DB_1.0.hqx
new file mode 100644
index 000000000..db1f57899
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/pass/BeagleWorks_DB_1.0.hqx
@@ -0,0 +1,176 @@
+(This file must be converted with BinHex 4.0)
+:#'4KG'%ZBRFa!%*AC'*#9fYc!*!%*#-!!!&LNq0#9fYc3PGNBN*AC')!N!8"!*!
+(!3#3"J%(!*!%"B`!#3!!!!N!N!`"!*!%"`!"!!m!!!")!%J!N!3#m!*!rr(rlJ-
+*!P*M!J8S!r`"!!!!!@J"D!#3"!k`#d!!!3%!!'3!!3!!!!%!!J!!!!%R$`!"!*!
+1%!#3#4!!rlArTJmY#jS!#!%!N!dC!3!!!3F!N!J""`#31!C(C@jPGQ%#+!!"C'p
+cG3Je!*!&8lPF!&1m)!!!!%J!!!")!!!!5!!!!%J!N!8"!LCQ2J#3"!0`!&'hQ!#
+3"!%V!*!&C22Q!&2+E!"6bU3!!!!"!*!1$e0dH@aP9h*TG'9b)%a[C`#3ZJG3B@G
+P)#C`!*$j,J!+F(*PCJ#3"e1jA!"6[#!!%`%%!`)#!3%"!!%!#J!!!#%!!`!(!!d
+!!`#3"5`!"!!m!!!%G'9iG!4'Efjd!"YR!!46DATP!"YS!!96G(PXC3!ED3!&3fp
+XEh)!'fS!!5d!N!3+!'J!8lMBrrm!b3!m!!!'ER9YBQ9b!*-i!!!!"J#3&%j@rp4
+)j`mB*Qi!%#KZ!!J"4`"6Z0Mrr`!)!$`!!!4NBA4P!J!!MlJ!!!!1!*!86PB!!#m
+-+'i!##m-)'`!!J*S!&1if2rr!2`!2!!!"(4TE@8#5J"B6fF'-#i!$Q"H)'`!+#"
+3)'J!%Le)rr`J8#CS!%K)EJ!1,`Y1V3Xk2J!$4`"6Z0Mrr`"Z!!!!+3!#!!*Z!!!
+!"daKH@peG$%!N"K6Z3!!8lL`!&1iV!!)!3#3#Irrcl2JG!"6Z9`!8lLi!3#3#%J
+!!!")!!!!5!!!!%J!N!8"!LCQQ!#3+f6c2[rr!!!"%!"4YjJ!N-3(8'&RC5!QF!#
+31@6cMJ!!!-J!8EHB!*!,C-0+!!KTB!!)!!%!8m$`!&2'r!"6a0B!N&&6c(`!N%B
+"N!3!!3#3"%E!!!!!#`!!P9J!N"K19[rd51F6'#KZ!!JJ$'B55(J#D%kY"0SS3#!
+-@%pR!!3XGJ%J$'B8,`0`"Lm!6Ud%fPL2*Kp+J'B#GJ"+!fFB,`a1V3!k)&3JVI!
+k)&4#D!!%F!"B6f!#F!!S6#"8)+hb&L"83LJ!"b"8F!!K3!!U)&3K3!!Z)&3K3!!
+Q)&3K3!"))&4#+!"-F!![!%kk#$3J9#&!!#CBMbm!6Ud*SR!!*N"f!5),CKB[!h!
+1,`"1V36D@)mQ(bC!)!YQ!RB!5J0R4RB")!YQ&#m$F!`[!2rr!!"BMbBI5S"Q!RB
+!5J0R%Lm,6Ud,+L"6)#hN6L#!@%pJ!R!!*NXJ8b#Ym,JJ8c&m!(8!$("eB!*`!#"
+8)8X!5#m,6Ud*SL"83QJ!-L"8)@i!$!"%IJ%J9"&(!$3J9"&m!!%!08)()&344`!
+f)&4#+!!k)&3aI2rr!$j)H!A'6Ud'bL"8)8!!+L"8,bJ!+NkY#D)J9#mS!#T1V3F
++@)m[!%kY#D*#4hB'@%p)ab"8)'J!+L"3)!FL!-$m!24)3F,m!24)38*"d)%a[2r
+r#!*)ab"8)'J!+L"3)!FL!-$m!24)3F,m!24)38*"d)&#-!J%5-Irr`!!!#SJ8#!
+()J$!r!$d5%(#r!$d5%&#3G#"3M!)"6!(8NHf4fk3!#"8)'J!+L"33QJ!!L"8)'J
+!+L"3-,`!!8*(GJBJ9#"S!#SJ8%(S"F"#-(!!)&3JD!!U)&""k!@k%E`!!R!!-!G
+54lC(EYBJ9#mS!#T1V3FU)&3[+!!U6Ud(%NKi"B41V3E+)&3K3!!Z)&3[+!!Z6Ud
+*SL"8,bJ!,NkY"`TBMbm!6Ud*SL"8)'J!,L"33P"#4hB*6qm!$%M()&3JD!!Z)&!
+J"q@!-Ecrr`J+3NCd&'"-5-FJ9#"S!#iJ8#!()J$!r!"m5%(#r!"m5%&#3Irr!!!
+!K%*`#!")ab"8)'J!,L"3)!FL!-$m!(a)3F,m!(a)38*"d)&#-!Jd-!C54V4'EV!
+`"e*(YNGZML"8)'J!,L"3-Acrr`9F)&3JD!!Z)&"#D!9D)&3JD!!Z)&"#+!9B)&3
+JD!!Z)&"#+!9C)&3JD!!Z)&"#+!8b)&3JD!!Z)&"#+!8+)&3[+!!Z6Ud(+L"8,bJ
+!,NkY"a)J9%)S!$FJ9%)S!$JJ9(!!)8!!6P"2)&3JD!"%)&!YD!#)rr3[2'4[Fh8
+JE[rd,`JJ8#"3)QJ!$%k4*N"36b"6,LJ!'#"8)8F!8L"6,LJ!(#"8)8F!9L"6,LM
+rr`!!)8F!@L"6,LJ!*#"8)8F!AL"6(LJ!+5"8%8F!Bb"6(LJ!+L"8%8F!C#"6(LJ
+!+#"8%8F!BL"6(LJ!+b"8%8F!C5"62#J!,#"8-8B!CL"-S#NJ5k!T)&0"k!!Z,8M
+rq#m)5(J!rb"85'J!D%kY%FSJ8d(S!5iY52rm,`K)H!$r)&4)D!&S6Ud4bL",S#S
+J9%(S!%!JZ!)-)%bJ+Nr[!"JJ$%cZ'-Mri%jH6R919J!!)'i!##"3ASJJ#%jH6R9
+19J!!51F"'#CZ!!`SEJ!)F!!3%ci!8NF-4`!HE`*q(L",)P4HL8M()!HJ,L"8%@i
+!%`!'rrm!!2rd6Pj1G8j@!!")j`!S+'i!##"8ASJLEJ!-*&33+J!(5)"53%M!S#i
+J9#*Z!"!5U!!'61i8!2ri6Pj1G8j@!!![$#KZ!!JJ$'B35(J#G%kY"0SS3#!-@%p
+R3LmZ!!`[$%kkq[`S3#"8)+hai#"8F!!K3!*S)&4#+!*X)&34I!!"!R!J9"&m!!%
+#F5"8%A`!!3*b)&34I!!"!R036b!-+'lrr%jH6R919J!!51F!'#KZ!!JJ$'B35(J
+#D%kY"0SS3#!-@%pR,#mZ!!`[$%kkqT!!+%!J9##YmH4`!#m!6UdZ`LC!,`Y1V3Q
+L)&3K5`"16qm#N!B!N!K19J!!,``SE[rr)!crrh"#rrp1VIrr+%$rreK2rrm`,[r
+r5-$rrbmZrrm[$%kY+cSS3!"8)+hb+#"8)@i!&!!k)&4`!"!S!$J-3!!&6qm!$#!
+-+'lrr%jH6R919J!!,``SEJ!))!aQ%(!-,`"1V36U+%!J$&K2C`j`rbm!,`a1V5C
+b!!"36b!-+'lrr%jH6R919[r151FI1#KZ!!JJ$'B5F$![!%kY"0SS3#!-@%m!!!(
+3GJ%J$'B8,`0`"Lm!6Ud%fPL2*Kp+J'B#GJ"+!fFD,`a1V3!k)&3JVI!k)&3aI!"
+C!!4`@9K2B!*`!#K-)&3JVI)J)&4)D!!+6VVrAJ!!)@i!$!!'2A`!#[rd2A`!#[r
+bI!jq3AS$)&4(k!!+2Acrrrrf3J4`!"!%!)!hE[rf!!*+VJ!3@%pR!!$S)&4"k!!
++,8Mrr#"Z!"!J8#"S!)`Y52ri3HJ!+#C))'lrr#*,4HJ!"#6C*0NJEJ!3)&!JD!#
+d,8MrjL"3*QJ!!#!,C`!!SL"6)'J!*Le)rpSJ8$JS!!B[,J!36UdR+LC!@%mJ8c`
+S!#j54J!*cqJ!,#"61LJ!-%T%Cc)`"&0!5-![!#mZrpT1V8@5,8$rcLm!5'lrdNk
+Y3bSpE[r8rr3`,[r@@%!p32rb6qm!%%KZrpi[#dkY*YS3,[rL!!!#J!!!!"q![!!
+!!!%#,J!(rq)L!1F*JblriL"83qlrhNAS!"BNf56C8%m!E[rU,blrmM!(d'lrp$m
+!-!E3E[rb2`#STb"83qlrkNAS!"iNf56C5'lrkM!Zrr"63$m!2blrmM!(d'lrm$m
+!-!E3E[rb2`#STb"83qlrkJ!!!#BNf56C)&3a43!Z)!a-lKcirkj1ANje6PB!!%M
+R%!JSEJ!))!aQ%(!3!!"1V36D+%!J$&K2Cd*f!5!-CK3[!h!3,`"1V36D@)mQ(dU
+!CJ*f!%S$CaS[$%kY#USJ9##Ym$iJ9$&m!&S!$("D@%pJ!R!!+%`J9##YmL3!!%c
+Z%!Mrq%jH6R919J!!,``SEJ!))!aQ%(!H,`"1V36D+%!J$&K2CaS[,J!3,bi!$#m
+-6Ue'ULK!)&3JVI+)6qm!$#!-+'lrr%jH6R919J!!6Pj1G5"8!!!24!!@N!"T!")
+p32rqB!`pI!,3rr`pI!)FrriJ,[rm+'lrq!!!6R919J!!51F"'$iZ!!iSEJ!))&5
+qD!!mCb!QD!!N-8F!2#!,Ca3[#dkY!#S[#b"6)&!LD!"F6T&36dcZ')$rp%jH6R9
+19[ri51F6'$iZ!!iSEJ!),$`!C!!!,bhYi%kY&q)Y32rmF'X[!#mYlH"1V4ID@)m
+[!%kY&VS!!!a(J!"2l`!-CK"`!"m!5(S"YNkY#C*J!!'N$%GrrfBd)&3YD!!NrrJ
+J9!"(!$T+V[riC`!"L#mZrrK1V4`U)'lrq#m))&!J8#*S!&a1N9"2B!!"DJa(rrj
+X"(lqB!J-4`!$E`*q!b"8[QJ!1QG',@J!*2ri)&3a4`!k!!$rq'FD,blrq%kY(#S
+JE[ri,`JJ8#"3)QJ!A%k48%mJ9#"S!'BJ8%TS!!KR$#"8,bJ!CNkY$h*B6dT(Ea!
+J"ZqS,`![$%kk!6*36f!85-FJ"d5!)JEJS5m",`a1ZJ%F8%mJ9(!$X'J!1QBQF2m
+[!%Ki"")[,[rm6UdF8R!!,`")H!34,blrr%kY(&*2l`!BB&3J9($qX'J!1QBQF!!
+[!%Ki"")[,J$m6UdF8R$r,`")H!34,blrr%kY(&*2l`!BB#4`!#m!5(J%%LmZrr`
+!V4a5F!![!%Ki""%[,[rm6UdF8Nr[!"K9Mb"6,bJ!"+P32KpJ'J#3"2rr,`F[#b"
+6)&!LD!")6T&2l`!-8dG+4flL)&4`rV"S!$TZ*R!$X'J!N!9D!!3!!!",!!S!!`!
+!!(-!#J!$#!!!F`!+!!S!'!!Q!!S!*3!B!'8!!3",!!S!!`!!!(-!#J!$#!!!F`!
+F!!S!+J!l!"`!1J!U!(S!!J",!!S!!`#J!(-!#J!$#!!!F`!Z!!S!2!!Q!#i!*3!
+m!'8!!`",!!S!!`$%!(-!#J!$#!!!F`"!!!S!6J!T!%!!+!"1!'J!%!"e!!J!!!!
+"!!)!!`!%!!8!"J!(!3*L!!!""daKH@peG$*3)QJ!5%k46qm!$%cZ'-Mrj%jH6R8
+X9!"6Z+!!8lL3!!"6Z)`!#!%!N!4K!#"ZErrrcl2JG3"6Z9`!8lLB!AN!8lL%!!!
+!5!!!!%J!!!")!!!!5!#3"3%#*QB-!$BJ$&K2C`a)H!36,`a1V4ND8%mSE[rm6Pj
+1G8j@!!")j`%B(Li!$bKZ!!JJ9,iS!&&R'LCS!#344`"4)!YR$Lm,)&-J8#*S!&a
+1N9K261iBJ2rd6Pj1G8j@!!!JEJ!))&!4EJ!2!&*1ANje6PB!!%MR!4JH,J!2+'i
+!##"8[LJ!8fFD*QJ!*"&(!&-J#fF1,`XJ8b"3)QJ!A%k4@%p-lKL!rr41ANje6PB
+!!%MR!aJF,J!6(Li!$bKZ!!K+"QF))&5q+!"BCJa+"QBf)&5q+!"CCbiJ9#CS!#4
++"QF'%8F!@'!')&344`"C)!YR&#m,6UdF+Lm,)&-J8#*S"e"KCf8J*R!B`2r`6Pj
+1G8j@!!")j`%B(Li!$bKZ!!JJ9,iS!&9R)#CS!#344`"9)!YR&#m,6UdF+Lm,)&-
+J8#*S!&a1N9"261iBJ2rd6Pj1G8j@!!")j`%B(Li!$bKZ!!JJ9,iS!&CR)#CS!#3
+44`"@)!YR&#m,6UdF+Lm,)&-J8#*S!&a1N9"261iBJ2rd6Pj1G8j@!!")j`%B(Li
+!$bKZ!!JJ9,iS!&TR'LCS!#344`"D)!YR$Lm,)&-J8#*S!&a1N9K261iBJ2rd6Pj
+1G8j@!!")j`!B+'i!##CYj'iJ8b!S!#!%J%06G(PR(!5!-!rXmfBF)&-`+!!Q5-!
+[!!!"!*!%)!YR,#m,)&-J8#*S!#a1N5e!rra)E[riU(3[,[rmU(-[,[riU(0`!5m
+!,`a1V4H561iB!2r`6Pj1G8j@r`")j`-B4qlr!$`Z!!iSEJ!)5-B["L"8,bJ!ENk
+Y#j)q!!a(rrp36fBd2`B[#kMr5-B["Lm,)&3[+!"Z6Ud,HNM',`BJ9#mS!'j1V3Z
+52J!-4rrr6qm!&'B%F!"J!K!(61iB`2l`6Pj1G8j@!!"`!"!Z!!m[!#"Z!!JJ8#m
+S!'j1V3Z#6Pj1G8j@!!")j`!B+'i!##"8*QJ!2L"65P"[$#*Z!!`cD!!#!!CJ#L"
+Z!!`aI!!$rrm!!#CS!%)J8dT3E`SLEJ!--UJ!!Q!))'i!$$#m!!`J9#CS!%BJ8dT
+3E``LEJ!--fJ!!J!%B!SJEJ!--A`!)3!%9BmJ9#mS!%USDb"Z!!`aA`!#61iB!2r
+i6Pj1G8j@!!"1ANje6PB!!(!"6Pj1G8j@rrK`!#e!rr`Y32ri)'i!#%2ZrrJJf5$
+C6Pj1G3!!#-6rr`!"I#-!N!8"rrr!!Amc!*!%r"Irr`!"JJ%!N!6J![rrp!'$$3#
+3"1!"!!hd!E(*!!KTp1!!!",`!JdM!!KTk0rr!"R`!K,h!!KU)0rq!#A`!NeA!!K
+TN!$Ir3!`rrm!!!!)DBcIr!"'-!*A23#3"0rl!&8`!V-(!*!%hrS!CI!#Yb%!#'P
+FhrN!FM!#kkX!N!6Iq!"m-!,q*3#3"0rh!)%`!`'j!*!%hrB!M6!$#X-!N!6Ip3#
+Am!--d3!)DA6Ip!#Fm!-b43!)DGMIm`#M-!0$S3#3"0rb!+X`!fdT!*!%hr%!ZM!
+$F2%!N!6Im!$(-!1$i`#3"0r[!0)`!iLc!*!%hqi!i$!$N@d!N!6Il3$Y-!1F"`#
+3"0rX!2X`!kL0!*!%hqX"$6!$UP-!N!6IkJ%D-!2EE`#3"0rT!58`!pZjrrm!!0r
+S!6%`!p`K!*!%hqF"3$!$h*-!N!6IjJ&,-!2ae`#3"0rP!9B`!r-j!*!%hq3"B6!
+$pi-!N!6Ii`&[-!2hk3#3"0rL!Am`!rJe!*!%hq%"Lc!%'!-!N!6Ii!'C-!3HN`#
+3"0rI!D%`"&m6!*!%hpi"V$!%Bhm!N!6Ih3'p-!4NR`#3"0rF!G%`"'C4!*!%hpX
+"jc!%Cqm!N!6IfJ(d-!4ST`#3"0rC!J!`"'P&!*!%hpJ#$c!%DRm!N!6Ie`)J-!4
+Z'`#3"0r@!LJ`"'r"!*!%hp8#-6!%FCm!N!6rr`!!-!4aY`#3"0r6!NF`"*ha!*!
+%hp)#6M!%Sq%!N!6Id3*D-!5ff3#3"0r3!QB`",UC!*!%hmm#F6!%[E-!N!6IcJ*
+k-!6Yi3#3"0r0!SB`"1rj!*!%hm`#N6!%ml8!N!6Ib`+E-!8'-3#3"0r+!U)`"3I
+9!*!%hmN#VM!&&NF!N!6Ib!+j-!8BB`#3"0r(!XF`"4NC!*!%hmB#fM!&'Xd!N!6
+Ia3,X-!8EE`#3"0r%![J`"4q0!*!%hm-$#6!&+0N!N!6I`J-Cm!8Vi3!)DH$I`3-
+J-!9%Y`#3"0r!!b[rr`#3"Yqr!c8`"@8P!*!%hli$4r!&CC8!#'Q)hld$82!&CT8
+!#'Q%hl`$@[!&KL-!#'RFhlX$Ar!&L)-!#'PihlS$C6!&LGN!N!6IZ30d-!@+P`#
+3"0qi!i)`"CJ(!*!%hlF$N!!`"CM2!*!%hlB$Sc!&TDF!N!6IY31e-!@X9`#3"0q
+d!l``"DbP!*!%hl-$c$!&XUm!N!6IXJ2H-!@pr`#3"0qa!r!`"F($!*!%hl!$rM!
+&b@-!N!6IV`3$m!AB@3!)DB$IVJ30m!AE0`!)DAcIV33Cm!AF33!)D@MIV!3K-!A
+GX`+3"J#3$"R)!!$rr`!!rrm!!2rr!!$rr`!!rrm!!2rr!!$rr`!!rrp19[rr51F
+"'#iZ!"3!EJ!-+'i!##!-CK"`&Lm!6Ud%fLK!)!aB6fG@,`a1ZJdS+%!J9##Yj+3
+J9#&,!!iJ9"&Z!"-!"($rX)GB6fBF,`Y1V3iU)&3K3!!5,`Y1V3!!)&3K3!!'8%p
+J$L"8)@hXc!!5)&3K4`!')&4`!#&!!!SJ$%cZ')$rp%jH!(919[rF51F"'#KZ!!J
+J9#CS!!j`!5m!)'J!%L"3,bJ!2%kY&j)J9"!S!!46!&"2C3!#1J`!!!4L!!)bFJ!
+5!0*"-MX3"Nll%!!!'!!-!L3!!!%`,`a1ZJD8@%pJ!!)1)&3[+!!56UdJqLe!rq!
+J9#"S!!UJ+5"8)'J!#J"3rp`J9$!S!!K)`#m!,blri%kY'F*)E[rZ5'lrl%KZrr4
+)E[r`)&3`+!!)5-![!#m,6Ud1dL"Zrp`[+!!1,bJ!#M!S!"*)`#m!)&3`+!!)!!!
+[!#m,6Ud15L"8-#J!#%M!,`![,[rJ6UdC`R!!,`![!%KZrra)E[ri)&3!+!!)5-%
+[!5m,6Ud1dL"8)'J!%L"3,@J!22rN-#lrlNM!,`!`,[rX5-![!#mZrr`[,[ri)'l
+rh$!S!"*)`#m!-#lrlNM!,`!`,[rX5-![!!!!rr3[,[r`-#J!#%M!,`!JE[rN,`J
+J8#"3)QJ!V%k4)&3JD!!+S#T2l`#%!!!!pL"8-#J!#%M!,`![+!!5,bJ!$NkY$fS
+Z!#m,6Ud0iL"8-#J!#%M!,`![#dkY$e*b!$)!5S%J9#&"!!SJ9(!%X+J!#Nr[!"K
+Q'(!),`#3"!K)`5m",`Y1V3pD6qm!$'!BF!B[!#"8-LJ!#%M",`%[#dkY$eT2l`!
+-!!Y1V3p+5N"@`%3!5)")`&L2,`"`"bm!FQ8[!5mYlH"1V4I5)&3[+!!5)'J!%L"
+3)&!LD!"%6T%Y32rS+d$NCL"8,bJ!%L"S!")J8#"3)QJ!!%k4@)m[!#"8,bJ!%Nk
+Y)2TBMbm!6UdLHL"8,bJ!%Lm(,`Y1V3hD6qm!+!$Z')$rd%jH6R919[r%51F"'#K
+Z!!JJ9#eS!!lrr(!",`!J9#"S!")J8#mS!$a1V4H5)&33+!!%8`"36f8!!QB-!!!
+%BJ!#AR)!%J$536)l!!"1qa!!!"J!$!*3!6J"4#m-6VS&@PK2B!!#1PQ2U0JYArr
+))&3JD!!+S#N!9#"S!!SQ8#"8,bJ!%NkY)2SY32r%)&3`+!!)5-![!#mZrm41V4R
+#5'lrkNKZrqK)E[r`5'lrl#"8-#J!#%M!,`![,[rm6Ud1dLmV!!3[%`!!!!K)`#m
+!)&3`+!!)5-![!#mZrra1V3j+)&3`+!!)5-![!#mZrm41V4R#!!![!#m!5'lrq%K
+Zrr3J9$)S!!K)`5m",blrr%kY$Y)J9#"S!")J8#eS!$cri$!ZrqT)`#m!-#lrk%M
+!,`![,[ri,blrp$!V!"*)`#m!-#i!!%M!,`!`,[rS5-![!#mZrr![,[rX-#X!#%M
+!,`!JE[rJ,`JJ8#"3)QJ!V%k4)&3JD!!+S#S[,[r)U0P2l`#%B!!"'Lm-6VS#m&K
+2B!!"$L"8*QJ!%LeS!!lrc#"8-#J!#%M!,`![#bmS!!j1V3pU,J")E[rD5'lrf#m
+,)&-J8#*S!1"1N5e!rp`J9(!!-#J!$#m!-#J!#%M!,`![,[r-6Ud2@NKZ!0!J9#m
+S!")JD!!5)&!J8#*S!$"1N5m,)&-J8#*S!%41N5e!rq3V3!"Q,`XJ8b"3)QJ!4%k
+4@)m[!#m,6UdJqPL2,`"1V5*k,`X["bmZ!*!%rrpCMbmZrpa1V3%UF!5`RfB5,bl
+rh%kY"`Tb!")!5S&B6f!#FJ&)EJ#3"9S!"!!!rrm!#J!$!!!!F`!+!!-)!!"c!"`
+!#J!U!%N!(!")!#S!L!!"rrm!#J!$!!!!F`!+!!-)!!"c!#i!#J!m!%N!,J")!$`
+!L!!#rrm!#J!$!+!!F`!+!!-)!!"c!%!!#J"1!%N!3!")!%i!L!!$rrm!#J!$!-3
+!F`!+!!-)!!"c!&)!#J"J!%N!8J")!'!!L!!3!(8!#!!!!!%!!J!$!!3!"3!'!!F
+!N!8(!!F!N!GF!!$rr`#3#3-!!`"F$#!!!!%[J!!!!(4[G'm5%!"6YjJ!8lF!3!$
+!!*!(%K#U9DT9UP@!!%!Y!!!!!4eD!!!5%!!-!!)#A(3!3#d!!!!"1a"!,!!"!!!
+!A!!!rrm!N!F*!!-!!`"F$#!!CqQ+!&1j!(4eG(85%!#3#%!"J!#3"a)3!*!)3#d
+!!!!"(CB!!")3!!`!!Ic8!!"!,3!!!!%l%&@A!!)!!!"F!!$rr`"RkBS!8lP-!!-
+!!`"F$#!!N!KdDA4T%K#k#!#3"N!"S!#3"a)3!'J!!!!-!!"!,3#3"28U!!!5%2h
+m!!S!N!4!,3!!!!%l%'X%!!-!!!"'!!$rrbaZG@eLCA)X!!-!!!"'-L!!CqQ+!&1
+j!#KMEfjdB@PZFb!d)'CTC@aNFcSJG'9iG#aZG@eLCA)XC'&dC5adD@eP+3!%!!!
+!9!!!rrpQD@9XC#!a+J!$!!!!9$mJG(8XG'PdD3!SD@iJCQPPE'3J-6SJG'pdEba
+dGA4e,(4TG'NVG'KPFf8JCQPfC5"MEfeYC@jdFbFJE'PZCA-T!!!&!!!!-!!!rrm
+!+!!@!')!!!!$!!!!-"XJ!!S!$!!S!!!SD@iJCQPPE'3J-MSJ-b`d,$8T&J!'!!!
+!2J!!rrmJCQPPE'3J)`!$!!!!2LSJ-5mc-3#3"#KTEL"QD@9XC#!c1L!a,c%[0#`
+a,c-a,c3X-6)[-5mi15N!"`!!!$J!!2rrCQPPE'3J0#S!!`!!!$JN)$!`,$8!N!3
+SD@iJCQPPE'3J0$SJ-cS`-#`d1M!`,$8k-$!T!!!!!`!!!!i!!3",!!S!!`!!!(-
+!!!!"!%X!#J!$!!!!F`!"!!%!5`!+!!-!S!"c!!)!!3",!!S!!`$%!(-!!`#3"3)
+!N!AV!!!!"`!"!!J!!J!(!!&J%`!!!3!!!!%F!!!!(!!!!%BN&3&Qqbi4!4F"hlc
+i2&X&!$1($fN&*`4j$k&kJ3&QH`SUC'&dB5jLGc%`!!)!!!"#9f4L3PGVF`#3#N*
+AC'*#9fYc!*!Bcl2K3!#3"J&L`iXm1aJl5d6KDk*V'0X#`BJl%&-$3`k"!(-9DbV
+E$3-$(JS!@eYD5!J+,(X!$+)F+)@-q!p#Z#NX*43-U+,VBkY5$a*`QaK&1aBXmeA
+$$+Y52Z-Rd"*E!X8e8dHS2&CV!PF&,$ciZ`9QUe)T$S%-$`%5&`'dUe*X$`!VD34
+)i3"P"J!!!!J!6J!#!G`#GJ!!!!`,3Q9KCfaP9fpbDh-!!!%!!!!"(!!!!"`!!!"
+'!&1m3"S8!!!!(!"'!!&h8'pc!!!!%P088L!!!!!H!qRrr`#3#,rdrrm!!!!-!*!
+%LTX!:
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisResolve_1.0.hqx b/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisResolve_1.0.hqx
new file mode 100644
index 000000000..2e9546ca8
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisResolve_1.0.hqx
@@ -0,0 +1,43 @@
+(This file must be converted with BinHex 4.0)
+:#A0SC@9d,R*cGJ"5FeGc8R0XGJ%!!!!(I!!!!8DiV%*"9&p#9&06-$%`-3!!!18
+"!*!)(-Ga(-GaE$m!!!!2rrrr!*!%!Iq3"!!!!!(rrrm""3!8!"3!!!$qr`#3"J)
+%!!!!$rrrr`#3"!(rN!3!!!!"rrrr!38!&!!8!!!!r[m!N!B#"!!!!!rrrrm%!!!
+!!Iq3"!!!!!(rrrm""3!8!"3!lZlZ!Irrr`%!!!!"rrrr!38!N!3"rrrr!38!N!3
+'rrrr!38!N!33rrrr!38!N!8+!3C(C@jPGQ%!N!JF!!!!"!#3#`e"99428d&@45j
+#380,!*!%rhrrI`!!r[m!N!Eqr`#3"[lr!*!'r[m!N!Eqr`#3"[lr!*!'r[m!N!E
+qr`#3"[lr!*!%13!"!!!!"!!-!!N!N!Aqrrlr!3#3"`3!!J#3#3%!!!!"!*!0"3!
+(!'X!D3#3*3%!!3#3"Jrrrrm"!!!!!Irrr`%&!*!%$rrrr`3!!!!"rrrr!38!N!3
+2rrrr*!!!!!(rrrm"&!!"!!%N!*!+!3!3!2rr0!-%!0`&"3#X$Iprh!8#!!J!rrm
+%!Ipr"!%$!!!!"!!!!!9!#3!!!!N!"3F!!J!%!!K!$!!!!!%!N!3C"(4PH(6r#%!
+2!!%!!3#3""J!N!E`2rm)3"3!!J!"!!!!"!!!!2rr,!#3"JK!r`K!%J!$!!%!!!!
+-#!#3"IlrrrqR!Im*3#!!!!!2!!!!#J#3"`rrrrm"h3!!!3#3"!C(C@jPGQ%*3#!
+!!3!"!!!!#J!"!*!&$rrrr`(G!!!"!*!%"NGPEQ9fB3P!)!!#!!%!!!!+!!)!N!8
+2rrrr!Gd!!!%!N!3'4f9ZCACK#8!J!!-!!3!!!!S!"!#3"3rrrrm"h3!!!3#3"!C
+(C@jPGQ%*3#!!"!!"!!!!#J#3"`rrrrm"h3!!!Gd!!!!'4f9ZCACK#8!J!!8!!3!
+!!!S!N!F2rrrr!Gd!!!%!!0d!"NGPEQ9fB3P!)!!'!!%!!!!+!*!($rrrr`(G!!!
+"!)J!!!C(C@jPGQ%*3#!!"`!"!!!!%J#3"`rrrrm"h3!!!3#3"!C(C@jPGQ%*3#%
+!#!!"!!!!#J#3"`rrrrm"h3!!!3#3"!G$Eh9bD@9b#8!J!!N!!`!!!!S!N!F2rrr
+r!Gd!N!F'4f9ZCACK#8!Z!!S!!3!!!!S!!!!"!!!!$rrrr`(G!!!"!*!%"NGPEQ9
+fB3d"SaXE'aiE'a`G("`F#8!Z!!X!!3!!!!S!!!!"!!!!$rrrr`(G!!!"!*!%"NG
+PEQ9fB3dE'aXH'aXFN!F-3&8!N!8&!!)!!J!!!2rr"Qj[FQeKE!)!!J!"!2rr"'*
+[E'3#!!)!!J$rr`CTG'&XD@-$!!)!!`$rr`PeEQ4PFQaTEQ8!!`!#!!!!rrm+BQP
+R)'0[E(9YEJa!63!"!!!!"!!#!!)!"!$rr`0bC@3#!!)!"3$rr`4LE(9P!J!#!!B
+!rrm&Ch*PC@i$!!)!"`$rr`Na1#"`EfPZG(-#!!)!#!$rr`GMEh9bD@9b$%"-!!)
+!!!!$!!-!!J!!!2rr,@0SEfpcD@jR)'&XD@GZ)'PZ)'0PE'`JC'pPFb"ZEh3JFf9
+PE5"`Eh0cD@*XC3%!!J!!!!%!!J!!!!%!!J!!!!a!)!!$!*!&!`!#!!!!rrm6Ffp
+YC5"ZG@eLCA)JCQpbE@&dF`a!C!!%!!!!"3!&!!)!!!$rrjUCN!A*2`8!%J!*!2r
+rQTQ3"FNr"3!L!JN!rrqDQC!&b6m&!$!!#3$rrjUCN!A*2`8!iJ!+!2rrQTQ3"FN
+r"3$L!!X!rrqDQC!&b6m-3#-!"3!!!!%!!J!#!!!!rrm'B5"NBA4P"3"5!!!!rrm
+!N!4!b10!$%!C!!B!N!8$!!)!!!$rr`acEfeP)'C[FQeeE'%-3%%!"`!!!!-!)J!
+#!*!&"(4PH(3P!!)!!!!"!*!(m$mP!!)!!!!#!*!(#%!P!!)!!!!$!*!(%%!43!`
+!!!!,+"XE'aiE'a`G("`43!N!!3!)+"XE'aiE'a`43!N!!J!)+"XE("dF!8X43!d
+!!`!-!D-E'aXH'aXF(4`F%8!3!!3!$aXE'aiE'a`G("`8)%40)K&!$J!&!!dE'aX
+H'aXF(4`F*J&'%8!,!!B!#J'd*KXE'aiE'a`43!i!"`!0!D-E'aXH'aXF(4`F("&
+!$J!)!!dE'aXH'aXFN!F5!!!!%`!!!'8!#J$rI`!!!J!#!!!!CJ!+!2pr!!!#!!)
+!!!"R!#!!N!BS+"N!N!`)!!-!"%N!N!4N!2m2!!"DT3!!!3!!!!%8!!!!&!!!!$)
+!&3#3"G3"-!!"!*!)$jm!N!39!*!&#A0SC@9d,R*cGJ)!!!"5FeGc8R0XGJ#3$&*
+c9h05Ffaf!*!Bcl)h@J#3"J&'!0S!PJ%J"!46BACP!*!&RJ$D!,!")!3'3f&ZBf9
+X!*!&L!!1!*J!aBJ)8f&fC5"KFcS!N!8G!-B!-3%ZJ!#3"MJ!fJ"+!5!%"89UC@0
+d!*!'8J$D!'3")!3&4(*TGQ8!N!DG!"%!V3$#%!#3"Kd!$J!!!"!23faKFQPc)&*
+PFfpXGQ@U!!!"!!!!!43!!!!8!!!!-J!$!R3%DJ!!!"`!-J!!8e45)!!!!!Urp2r
+r!*!)kbS!:
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_2.0.hqx b/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_2.0.hqx
new file mode 100644
index 000000000..b9bc98144
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_2.0.hqx
@@ -0,0 +1,102 @@
+(This file must be converted with BinHex 4.0)
+:#A0SC@9d,Q0hD`"$9e063Np#6`%!!!!H4J!!!8)+9J)!2!0#6d*2!!%!A9`d!*!
+%!aJ#C!!N!#3!*!!N!#3!*!,d!N!"!!!"!*!5!3!!!J!#!!!!A9UX!*!(!3!"!!)
+!(&La!!S!!!!"!!!!!3"G@U`!N!3$!`#3$9eF,!#3FeeCm!!!!&eF3!)#!*!&&3!
+!$!%!!!!"!J)!!!%!N!8"!!!"!!%!,3!!!3!"!*!%@J!!!")!N!8'!3#3"!%!C!#
+3*3`!!2rr!!!!B!!!!!)!!!"i!!m!!!")!%J!N!3#m!*!rr(rlJ-*!P*M!J8S!r`
+"!!!!!@J"D!#3"!k`#d!!!3%!!'3!!3!!!!%!!J!!!!%R$`!"!*!1%!#3#4!!rlA
+rTJmY#jS!#!%!N!dC!3#3&a`!!2rr!!!!"!!3!!%!"3!!!3!"!3!!!3#3#PeKJ!)
+!N!3"!!J!N!Vrr`#3"2rr!!%!!3!!!!%!N!X"!)N!N"8T!!!"p3#3"3%!!3"5!QX
+!N!88!DB!N"eG@YJ!N!PG@JJ!N(9G@DJ!N!88!!!"TJ*V!!%!!!%!N!3"!!!"!*!
+-AB,-!*!&D6HL#`#3$J%!#!#3"eeDe!!!(b3!N!crN!J!+!!$!Gd#I3!$4&0&9!!
+!!G3!!Irr!!!!-!'B!!)#!!!"!I3!+!"G@Z!!N!m#!&eDj!"G@VJ!)!!$#3!"!!"
+)!!i!N!9G@M!NN!Bi**$j!*!*#!!$!!J!!`!)!!-!#3!#!!N!N!B"!!%"!!%!N!8
+#!*!&$J!B!"J!$J#3$!*V!C)!!3!"!!!!A9SX!&eD+!#3#!0T!*!%(3C!J!#3$3%
+!!!!"!!%!!!"G@X!!A9Sd!*!)!fN!!!!3!!N!!!!*!!)!#3!!!!N!!3!!!"S!!Ir
+r!!!!$J!!!!%!#3!!!!N!!J!!!!N!!`!!&R)!!3!!"!K$9%&#!!B!#3"G@ZJ!A9V
+-!&eD3!"G@Y`!A9V%!&eD1!"G@M`!N2m!N2m!N2m!N1S-3dp-63#3"9eDS!!!!Sa
+$5%j,!!N#!!&f!9B!M!#H!+S!!!#b!-J"%J$X!2J"#!#3E$!J"Qj[FQeKE&p`)3!
+$#3!'!$!K!!-*!!B!!h*PC$!J"@&XD@GZ-#!6C'PQCQ9bC@jd)'jeE@*PFQPZCb!
+J2rc-N!J`)!TcEfeP)'4KG'9c#@jN)(4TE@85G5!e)!Ja-Lmb0bmj-J!`)!acEfe
+P)'C[FQeeE'%"3#!$%!!"!!!!!6!J)@%JC'&dC5"KEQ3JFfpYC5"dD@eP*h-JER9
+YBQ9bD@jRF`#3"5!!!fi8!!!!!3!!!!%!!2q3"J!"!*!*%!!$EK$rN!J!!!!-!!0
+Z$!#3"a3!!fjS!!S!N!L!#!!!!"3!!fiF!!S!N!L!L!!!2'3)8)S)#)L%#!J!J!J
+)!)!)#!#!#!J!J!J)!)!)#!#!#!!!2%"Ea!#3"BMrr`!)A0i!N!@*rrm!#&hi!*!
+&J2rr!!`@&J#3"B(rr`!-&MB!N!@#rrm!$"C@!*!&Jrrr!!`@G3#3"B6rr`!-&TB
+!N!@'rrm!$"Df!*!%!I6rr`!)AV)!N!9lrrmJ#'l'!*!&J2rr!!K[@J"Ckp`!J2r
+r)!K[FJ"Ckq!!JIrr!!KaH!#3"B,rr`!)FFB!N!A*rrm!#(,8!&RVl!$)rrm!#(,
+J!&RVk!#!!!!!$%026%d!N!9G@UJ!!!+-3dK15`!)!J!"T!&q!*3!UJ$!!!!!cJ$
+3!3!"!J!!!1S!N'a`)3!$#3%"!$!K!!-*!3%!"'*[E'3!F#%!!`N!kJ!`)3!$#3$
+U!!9RFQ9PEM!J"'aPCR3!-#(rr`!!!33%E'9QG!#!)#%J2rc-N!L!)$BJ#$%b,c)
+h,cNb!%!J$`S1"a!!!4!!!a1!!2rr(`!!!!5!)#SJ2rfCN!J!N!3"i!+!!qJ!!!!
+8!!0Z$!!+!*!%!H!#J!#3"43!!fi-!!S!N!3"i!+!!!J!!!!8!!0Z$!!+!*!%!H!
+#J!##!!!!&!!$EJ`!#J#3"!(J!S!!N!88!!0Z$!!+!*!%!H!#J!!)!!!!&!!$EJ`
+!#J#3"!(J!S!!K`!!!"3!!fi-!!S!!J!2!")!(`#3"$NXrrm!#)-(!*!&L[rr!!L
+$%J#3"B[rr`!)Jad!N!@-rrm!#)-S!*!&MIrr!!L$-`#3"Blrr`!)Jci!N!@2rrm
+!#)0*!*!&N!$rr`!)Je3!N!@4rrm!#)0I!*!&N[rr!!L$DJ#3"C2rr`!)Jh8!N!@
+8rrm!#)1!!*!&PIrr!!L$L`#3"CErr`!)JjB!N!@Arrm!#)1K!*!&Q2rr!!L$V!#
+3"CRrr`!)JlF!N!@Drrm!#)2#!*!&Qrrr!!L$c3#3"C`!!!!-3dp-63#3"9eD5!!
+!!Sa$5%j,!!F#!!'L!A`!P!#X!-3!N!A8!3)""!!!!1`!N'a`)3!$#3)"!$!K!!-
+*!J%!"QPdB@aTB`&`)3!$#3$%!$!K!!-*!-3!"'*XG@8!-#!'Bf9ZG'9b!$!Krrm
+!!!%)"Q0PER4PFJ!L)$rmc*!)0b!)-6)[-MF[16)!3#!2"`i(%!!"%!!$%`!*!!!
+I!!!!"B!J,5!rrCQ3#"Ia!!`!!$F)l(J$l4Ih!!`EqJ#3"!2Z!!!fp!!!0[!!!!2
+d'")!$"`p!*!%0Z!B)!!-(*B!N!3$laJQ!!`!!$E-!!!(e2rr!!`G0J#3"DFB-J!
+-(AJ!N!3bb"Jh!!`H&J#3"CNB4!!-(RN!@H`X!*JB8!!-(T%!@H`S!*FB@J!-(UN
+!@H`N!*BBC`!-(X%!@H`J!*SBFJ!-(YN!@H`F!*XBI!!-([%!@H`B!+SBJ`!-(`N
+!@H`8!)XBM!!-(b%!@H`3!)!BP`!-(cN!@Ha3!))BR3!-(h3!@HbB!)FBSJ!-)&J
+!@Ha%!)`BV3!-)-i!@Hb!!)dBY`!-)C%!@HaX!)iB`3!-)S`!@HaS!*dBb`!-)i%
+!@Ha`!*mBeJ!-)p3!@H`i!+-Bj3!-*-m!@Ha)!+8Bm!!-*9d!N!@V'2i!$#BL!&R
+X6!2V'3-!$#Bl!*!%!q`C#3!-*V%!N!3$m4NB!!`Qj3#3"!2k'4i!$#F,!*!&$%0
+26%d!N!9G@X!!!!+-3dK15`!'!J!"V!'+!*3!VJ$)!*!&eJ!!!1)!!!$Z!*"XF#%
+!!`N%!3!`)3!$#33"!!PeEQ4PFQaTEQ9`)3!$%J!"!$!K!!-5!!%!#$%iF'pTER4
+c!$!J"A*TCfKd-#(rr`!!!3`&FQPRD(3M)$rmc*!)H5!)-6)[-MF[16)!3#!0&NN
+"&)!!rrf!!2rr(`!!!!S!N!3,ZIrr)!M&6J#3"B)!!$48b13!N!@%rrmJ#-PS!*!
+&K3!!0$c*l!#3"BErrb!)bR!!N!3(d[rr)!M+p!#3"!I6rrmJ#-Yi!*!%0"$rrb!
+)br`!N!3(eIrr)!J!!$2m!!!(e[rr)!M0"!#3"!IA!!!ck-f)!*!%"pMrr`!)cJ`
+!N!3ce2rr)!M1N!!!N!3$k[rr)!J!!$2!!!!$krrr)!M2Q!#3"!2XrrmJ#0!F!*!
+%!qhrrb!)d+!!N!3$l[rr)!M4*!#3"!2[rrmJ#0'S!*!%!r$rrb!)dL`!N!3$m[r
+r)!M5X!#3"!2crrmJ#0-d!*!%!r6rrb!)dlJ!N!3$p[rr)!M82!#3"!4ArrmJ#06
+!!*!%#lMrrb!)e83!N!3,ZIrr)!M9b!#3"B$rr`!)eN`!N!@"rrm!#0G3!*!&J[r
+r!!MB9!#3"B2rr`!)f9J!N!@+rrm!#0TF!*!&K2rr!!J!!!!-3dp-63#3"9eD6!!
+!!Sa$5%j,!!)#!!(N!Fi!!!#@!*!(TJ#3G)!JJ#%!&J!!!3!`)3!@!!!"!!GMEh9
+bD@9b*#!rr-b3##SJ2rfCN!K[G'8J8'&N!*!%&3!!8Q9MC@jd)%&`F'aTBf&dD@p
+ZF`#3"")!!&*PBf9ZG#"%Ef0eE@9ZG(-!N!33!!"5C@-!!#c%8f9bGQ9bF`#3"!X
+!!&0M!!!XX'p[D`#3"!S!!&0dD@0VD3!!,*`!!!d!!+8J8fKeG#"%EhGZ!!!XL!!
++!*!&(!!$EQ`!'!#3"#ad!!S!N!3"i!+!)!`!!!!8!!!XB!!"!*%!%`$5!&eCh!!
+!!$`!!fj%!#`@V)"%!!$rr`!5!%%!!3#3"dJ!!!")!*!&#!!"!!J!N!BI%!#3"!4
+C!!!!$!!$ERJ!F`%a!!!!$!!$EPJ!!!!m!!!!&!!$EQ`!!2rr!!!!"!!!!!%!!!!
+8!!0Z4!!+!*!%!H!#J!!"!!!!&!!$EN3!#J#3"!(J!S!##!!!!"3!!fji!!U!!B!
+"Irprr`#3"!%)!!0Z4!!"J!'!!ArrIrm!N!88!!0ZH!!+J!'!!ArrIrm!N!88!!0
+ZH!!+J!'!!ArrIrm!N!88!!0ZH!!+!!)!$`!5!"m!N!3VA!#3)`a$6da0!*!&A9V
+)!!!#M%0)6NX!!3)!!I3"k!#3#i`!N(3N3$rmc*!),5!rrCQ3#!#3%a3!!fh`4'&
+bFh4PE'aeEQF!N!3-!!0YY!!AG!!!!!)S!!0YK!"`!*3!F!(X!(%!P!"a!H`!M!#
+D!)`!iJ#-!5d!M!(Q!*`!iJ#F!1i!V!$U!+`!lJ#m!1S![!%4!-`!kJ$-!4%!h!#
+D!0`!kJ$F!5d!h!(Q!13!QJ$N!3N!p!%*!23"$3$p!5d!r3'!!2d"K!$p!HN""!#
+D!33"$3%G!5d"(3'!!4d"K!%G!HN"0J&-!6B"PJ%f!Dm"0J(P!6F"5J%h!8`"0`'
+@!6F"Q!%h!Dd"0`'[!6F"j3%h!HF"13&*!6N"5J%j!CJ"13'C!6N"V!%j!Dd"13(
+R!6N"k!&(!8N"4`&+!8F"Q!&(!CN"4`'X!8F"V3&(!HF"4`(S!8N"5J&*!8`"53'
+@!8N"Q!&*!Dd"53'[!8N"j3&*!HF"5J&-!8S"PJ&+!Dm"5J(P!*#,$%026%d!N!9
+G@M3!!!+-3dK15`!#!J!"jJ(Q!)`!N!QD!*"d-#!+BQPR)'0[E(9YEJ!Ni$rmc*!
+)"!`'M#!-9K-!N!3%$3DB)!a@P`#3"!31"U-J$&FE!*!%"!m'X#!-9jm!N!3%%!D
+m)!aB)`#3"!34"XSJ$&LR!*!%"")'eL!-@5X!N!3%%`EJ)!aCV`#3"!38"ZFJ$&S
+c!*!%""8'mb!-@VF!N!3%&JF")!aE1`#3"!3A"`XJ$&Zr!*!%""J(&L!-A%-!N!3
+%'3FM)!aFa`#3"!3D"bmJ$&e,!*!%""X(2b!-AFm!N!3%(!G2)!aH8`#3"!3G"e`
+J$&lA!*!%""i(D5!-AeX!N!3%(`Gc)!aIh`#3"!3J"i!J$'"M!*!%"#%(ML!-B1F
+!N!3%)JHF)!aKD`#3"!3M"kNJ$'([!*!%"#3(Vb!-BR-!N!3%*3Hh)!aLp`#3"!3
+Q"m%J$'0l!*!%"#F(cb!-Brm!N!3%+!IC)!aNJ`#3"!3T"q!J$'8(!*!%"#S(k5!
+-CBX!N!3%+`Ia)!aQ$`#3"!3X"rXJ$'D6!*!%"#d)#L!-CaF!N!3%,JJC)!aRQ`#
+3"!3[##-J$'JI!*!%"$!),b!-D+-!N!3%-3Jk)!aT*`#3"!3b#%3J$'QV!*!%"$-
+)6#!-DLm!N!3%0!K6)!`!!!!3!!(rr`!!!!3!!!!"!!%!(3#3$a3!![rr!!!!"!!
+!!!%#J!#3"3J!!!!8!!,rr`!!!!3!!!!"!CF!N!8E4&0&9!!!!&3!!2rr!!!!+!"
+)!!%!!!!#!!!!)`!!!#m`)Arrrrprrrrr!&eD*!#3&3%!!3#3"3'#(J#3"9eD)!"
+G@K`"D!!!!$B!!Irr!!!!+J!!!!)!N"%"!!%!N!D#(J#3$!&S!!!!%!!#rrm!!!!
+#!!!!!3*SrqJ!!!!3!!,rr`!!!!)!!!!"!BRrmJ#3"%C19%d!!!#F!!,rr`!!!%J
+!!!!"!!-!!`#3"!C(C@jPGQ%!N$S@!"B!N!3(3fpeFQPPFJ#31%099&-!N!4%8e9
+0!!!!*J#3$`i08'9bCQpbE@%J9A0PFJ#3#%K%6NN!!!!'!!"&9%*-!!!!1%C19%d
+!!"dL3e988`!!(FC%8e90!!!GcNK%6NN!!"hm494#6!!!(JErr[hmqrVjq2$am[2
+dpIEh4jB!!!%!!!!"%!!!!"!!!!!b!!!!%!!"rrm!!!!%!!!!!3!"!"d!N!`*FfK
+PCA3ZBhGV!J!#!%0A8e0#6d*2!3$rN!3!N!3#!%0A8e0#6d*2!3$rN!3!N",2X8B
+L!!!H4J!!!8)!,c!KIrrrrhrrrrm!A9SN!*!9!3!"!*!&!B)H!*!&A9SJ!&eD(!&
+S!!!!0J!"rrm!!!!U!!!!!J#3%3%!!3#3"S)H!*!-!@J!!!!3!!,rr`#3"3`,3fa
+KFQPc9fpbDh-!!!%!!!!"%!!!!"!!!!!b!&eEi"Mk!!!!(!!b!!"69&)J!!!!#Vr
+drrm!N!9G@CJiC3:
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_4.0.hqx b/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_4.0.hqx
new file mode 100644
index 000000000..0b5da872f
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_4.0.hqx
@@ -0,0 +1,160 @@
+(This file must be converted with BinHex 4.0)
+:$(0SC@9d,Q0hDbjf0!"$9e063Np#6`%!!!!U-!!!!D,$jJ3!R!"#6d*2!!%!@"0
+8!*!%!aJ#C!!N!#3!*!!N!#3!*!,d!N!"!!!"!*!5!3!!!J!"!!!!@"B3!*!("`!
+"!!!!!3!"!!)!(&La!!S!!!!"!!!!!3"B&K!!N!3$!`#3$9d!N'pG!*!(@"A%!!!
+!@"0J!J,rr`!!!!8!!!(r!3!"!!!#!!)!N!S"!!!"!!%!,3!!!3!"!*!%@J!!!")
+!N!8'!3#3"!%!!3#3'3i08'9bCQpbE@%J9A0PFJ#3$hJ!$`!!!%J!5!#3"!,`!N$
+rmIrZ!`N#8Q-#"5J$r!%!!!!"D!&S!*!%$V!,3!!"!3!!C!!"!!!!!3!#!!!!!5F
+2!!%!N!i3!*!*%!$rYIqQ$bd,QJ!)!3#3$4N"!*!,(!!!rrm!!!!%!"!!!3!&!!!
+"!!%"!!!"!*!+@"T`!J#3"!%!#!#3#[rr!*!%rrm!!3!"!!!!!3#3#`%!L3#3&5N
+!!!(e!*!&!3!"!&)#D`#3"43"TJ#3(9J9d!#3#9J9Q!#3G9J5a!#3"43!!!'Q!QX
+!!3!!!3#3"!%!!!%!N!aB1p!!N!9T*e),!*!1!3!)!*!(@"-S!!!I*!#3$2q3#!!
+S!!-"h3*p!!0%8d98!!!"e!!"rrm!!!!`!CJ!!J)!!!%"p!!S!&J6$!#3$`)!@"A
+8!&J9b!!)!!!!5!!1!*!*@"2!**!'1#53q3#3#3J!!!!)!!!!#!!!!!N!!J!*!*!
+'!3!"!3!"!*!&!J#3"3i!'!!B!!i!N!`#D`'5!!%!!3!!!&J9l!"B%dJ!N!J$D3#
+3""d'3)!!N!d"!!!!!3!"!!!!A9V!!&eD0!#3#!0T!!!!%!!*!!!!#3!#!!N!!!!
+*!!%!!!!D!!(rr`!!!!i!!!!"!!N!!!!*!!)!!!!*!!-!!"Cb!!%!!!3)3e4"3J!
+'!!N!@"-)!&J9Z!"B&D`!@"@N!&J61!"B%V`!@",!!*$r!*$r!*$r!*$U$%026%d
+!N!9B&D!!!!+-3dK15`!*!J!"AJ%&!)`!QJ#N!!!!X!$+!9F"D3%%!5F!N'd-!`!
+!#3CZEh*YB@aI!!J$!!!+!h*PC!!+!`!!#39KE'PREJ!B!`!!#40ND@CQCA*PER3
+JER9YBQ9bD@jR!!i#!!!*2rc-N!J!$J0S!!N*FfpYC5"NBA4P)'&ZC#"dD@eP%J!
+1!`!!#`Ja-Lmb0bmj-J!!%J-!!!N-FfpYC5"QEh*YG@aK!3!0"!!!#3!"!a!!!3#
+3"!i%ZJ!*!!!%%!!#(`!!!J!%"`!!#!!B!e`!#"0cEfeP)(4TE@8JER9YBQ9bD@j
+R!"!$!!!*#R0[E@8JC'&dCA-!!"`$!!!)&R0[E@8JG'PYC5Gc)'jeE@*PFQPZCh-
+!,'jeE@*PFPp[CPpND@GTG(0%!e*29`4MC@aXf`C648026N30Ff9bD@&XAfjeE@*
+PFN8%8dP(6JCZG@eLCA*'!e0*6JCZG@eLCA*H"&048P3'ER9YBQ9b4`969%4&9K0
+ZG@eLCA)a,'jeE@*PFM)X,LiZ5!0698d6ER9YBQ9b-5aZG@eLCA)b,#iZ,NN$9%&
+1"QjeE@*PFNS+9%9B9&424%&843PNBA4PAh4PH(33#94&@&486dj9634dCAKd6!T
+849K89%p858e&#A4TE@9IG'9iG%m%9%P044*SEh9b,'eTER9dC5acC@0[EQ40#P4
+*68986e4&@&3EFf9bD@&XAfjeE@*P!!!!$%026%d!N!9B&E3!!!+-3dK15`!)!J!
+"P!&M!)`!Q!#N!!!!X!#f!4-")`!!!2F!N'd+!`!!$!4LEfaN!!!+!`!!$39RFQ9
+PEJ!+!`!!$J4XC@Cd!!!%#!!!#3!1!J!!$crmc*!)!!3(k!!*!!i$D!!9#$%b,c)
+h,cBh$J!C"!!!#3!"$`S1"a!!!4!!!a1!!2rr(`#3""S%!!!*!!!2#Ji(%!!"%!!
+$%i!!rrmI!!!#!!!1!`!!#`Ja-Lmb0bmj-J!!"!J%!!KKEQGP,'PZC'9ie3GA489
+,4%&C$A0PFQPKE&pZG@eLCA*@#PG&48Y24PP&39)0Ff9bD@&XAfjeE@*PFPF%@89
+"8JecCA*TB@aIER9YBQ9b@!`pE3!!#S!pEJ!-rriJEHjX-#lrr%M!jBJJ8#"`#!`
+S8%T8CJ4`!'!`)'hZE$!Zrra)`1@))&!JF!J--$`"MX(ZrriJ8#*Z!!K"m!K-F')
+Lf&()rr`bf(!"+&p1ANje6PErq%MR!4JSEJ!)I[r1,!!&2c`!!dkY$Y)J3#CS!!J
+),!!!!!j8MfGm$!F!-@9f$!F!1@*`3Ulrq(!!%!F'32r228$rq#"6-#lrq,"S!%a
+X8N+Zrra#*amm!!&)E[rm,`Xr2!!mUHG#&bmZrr`[#cmm!&bTjamm!!%[,[ri,`X
+r2!"FUHF[#cmm!"#Tjb"Z!!``[!!$F2ml3,XJ1d#l(R!"B!4#9(!!60mBJ%jH6R9
+19[rb!!!!$%026%d!N!9B&J`!!!+-3dK15`!(!J!"M!&K!)`!QJ#Q!*!&Y!%,!4X
+!!!$[!*"Y$!-!!"%'DA4KE'PM!3!+!`!!%J4LE(9P!!!-!`!!%`CMC@jdCA)!!!i
+#!!!82rc-N!J!$!-&!!X'-Lma,c!dHM)!!"N%!!!*!!%2"`i(%!!"%!!$%`!*!!!
+I!*!%'J3!!!N!!!m($JF3!!%3!!-6!!N!!"m!!!B!!!i$D!!3#$%b,c)h,cBh$J!
+1!J!!!6rpQC!)!'!!"AB[2!(D!!%r2!'16UdABLe!r'jFMfFX,c`"fJ!"2c`"MNk
+Y&f)Y32afA)pR&Lmm!GS!!6mm!Bj1V4GL,8$mFPb2CJC`!'!!"5iJE[aZ)&!4I!!
+"!!`JE[aZ)&!4I!!"!!dJE[af)&!4I!!"!!`JE[af)&!4I!!#!!dJE[ab)&!4I!!
+"!!`JE[ab)&!4I!!$!!e)E[aZ,bhZE%kY&fT53&#2Cb4)E[af,bhZE%kY&fT53&#
+2Ca*)E[ab,bhZE%kY&fT53&#2CJC`!'!!"+T)H!"X5'lrP%kY#2T)E[f!,c`!#c,
+06Ud5iNKZrAT1V42#,#lpI$eZrAVrUN(Zr(SY52qQHJ"2l`!-B!!"5K!e85$ZCNR
+!28$q#%KZr(Sr2$,0F"h3E[i)2`"1V4,L3QFr,[qU,`C)E[ak5'lpHM!m!!'U8NK
+ZrAT1V3K55J"FMfBD3QFr,[h!,blp`NKZr(S!!!!-3dp-63#3"9J9R!!!!Sa$5%j
+,!!F#!!'-!@-!M!#F!+`!N!@i!3X"'3!!!2%!N'd1!`!!&JPeEQ4PFQaTEQ8!$J-
+!!"F)-6K`EfPZG(-!!!S$!!!B"A*TCfKd!!i#!!!C2rc-N!J!$!0)!"S(05mb-bm
+f0c)!!"F%!!!*!!%0&NN"&)!!rrf!!2rr(`#3""J%!!!*!!!0&NN"&)!!rrf!!2r
+r(`!!#J!!$!-&!!X'-Lma,c!dHJ!1!J!!'MrpQC!)"!`S!!%!"'C+)'fl!#*YZ`3
+`+!!FX'N"%'miF"M3VEX!+%!JEEX!)Qfl"$iT!4#HD!!FhP3-4`!%E!*q"$"()!L
+"r!!#-K553$"")Qfl"#0)!'C-ha#!6R919[ri51F"'#CZ!!SSEJ!1$'i!"3!)CJC
+`!'!!!,SJD`$d)&!SU!!3+@J!&!!%-#i!#'F1DdKA3'F`DN*53'SHB"3[$$mV!"!
+r+`!1U+N'E!!b!!CJ+!CX!#m!"'!J++h*+#PYb5`!"'!8,``r+`!32bX!$ULT-#f
+rq0&X!!Cq"GjYZ4,IE!!'hf`!"%KZrrK1V39D2Lfbl0jYXXT)air!5%FZM(!$N!"
+X!!)b"qG*d%%r!(!$N!"8FJc$ap"i#kS'3!!4d%%r!+LS3LF[$%KZrrJ[$+LUF!&
+-lKL!rqa1ANje6PEr!#m-5'lr!#"YXVJJD!#',a"1V4E53KG1V3$U5J"3MfB'F!"
+J!!#i!!!!$%026%d!N!9B%c`!!!+-3dK15`!$!J!"e!(%!!!!M!#3"jS!ZJ#3F``
+$!!!E"f0[GA*TCA)!$J)!!"`rr-b3#!!1!J!!!6rpQC!)!!`$5!!9"c8[-M-[0MF
+!$J-!!"S)-6)[-MF[16)!!"F%!!!*!!!0&NN"&)!!rrf!!2rr(`!!!&!KM!Mm8Qf
+bbR!(`'X!-Pe!8)pQ%N*R6Ud#'NS!9)pQ"J*VrrJ!-L!-60mFi%jH6R9)j`%))'f
+l"!`S!!%!"'C+)'fl!#*YZ`3`+!!FX'N"%'miF"M3VEX!+%!JEEX!)Qfl"$iT!4#
+HD!!FhP3-4`!%E!*q"$"()!L"r!!#-K553$"")Qfl"#0)!'C-ha#!6R919[ri51F
+"'#CZ!!SSEJ!1$'i!"3!)CJC`!'!!!,SJD`$d)&!SU!!3+@J!&!!%-#i!#'F1DdK
+A3'F`DN*53'SHB"3[$$mV!"!r+`!1U+N'E!!b!!CJ+!CX!#m!"'!J++h*+#PYb5`
+!"'!8,``r+`!32bX!$ULT-#frq0&X!!Cq"GjYZ4,IE!!'hf`!"%KZrrK1V39D2Lf
+bl0jYXXT)air!5%FZM(!$N!"X!!)b"qG*d%%r!(!$N!"8FJc$ap"i#kS'3!!4d%%
+r!+LS3LF[$%KZrrJ[$+LUF!&-lKL!rqa1ANje6PEr!#m-5'lr!#"YXVJJD!#',a"
+1V4E53KG1V3$U5J"3MfB'F!"J!!#i!!!!$%026%d!N!9B%R!!!!+-3dK15`!"!J!
+"m!(J!*!,M!#3G3i#!!!H2rc-N!J!$J)!!"mrrCQ3##m-2bX!%$mV!!kSU6!Y[rM
+4E!!'IJAHEEN5hf`!"YpX!!4)E[ri6Ud&@MiYXZcHEE,+5-H2`%K(,Sa`!j!!E!!
+#-JIR5G""2`"`!j!!9()-`mI3H!ZU"N!!%G""2`#SU%)R,`a)E[ri,`bSUR!"61i
+BJ2rX6Pj1G8j@r`![$%KZr`!JEE+i)'J!KLm36Ud@dN)A6Ud!kNS!8)pQ"R!!B!!
+!Z!!,1f``+!!b!N!-!!a!$!"Q#NKi!#"1V8E+@)p1V3`D2bi!%#mZ!!`[,J!),bf
+l!%KZr`"1Z[P%+%!J$%r[!"*Q"(!!B(!JEEX%!QMcr`!b+dbc1Lm-6Ud&%L"YZ`"
+#+!"25Ui!$&L2C`T#*dkY!`T8Mf!%6Ud*kL"YZ`!4I!!"!%p1V3BU,`a1V3B+(V`
+!!8kY!i*+,EN3@)pR'%)R,bfbZ%kY"1SH[!!",`a1V36U6qm!#L!-+&p1ANje6PE
+qANMR(aKm!(B!3QhZFMmm!qK1V3lD2J"+4e52C`!$&M!(8N!-3!!)BJ!#mN2k!`l
+5m3)!6Y%r2!!%6Ud$`Lmm!!%!"$mm!qj1V3lb+%!`EFLm)!MTL$Zm!!3*)-Kd,Sa
+1ZJEb6VS&M#C!,SY1ZJAX3UhZG%KY2GSr2!!'6Ud2DKYm!!!!$%026%d!N!9B&DJ
+!!!+-3dK15`!#!J!"hJ(H!)`!N!QH!*"e%!-!!!N+BQPR)'0[E(9YEJ!!$J)!!#!
+rr-b3#"YZrQAZF(!!%#hZF&"!2`"1V3Hb3KG`!"!YlR!r!%kklfaBMf!!!2*+!eI
+$4!0+!fF`2c`!"%kY$`)l3-Lq)'hZE#"3$&!!!952Bbi[,E,F2c`!"+JS,bfbh$m
+m!!@S+'!B3Qh)[LmYXY`r2!!%U#F[,E,F2c`!"DJR$'d!!FLqCJBlI!!#b,i-E3!
+#b,j["&0Yb,i`,HjbX'h)[QGL1fh)[Zjb3LF[#cmm!#bTjbm,6VS$M"km!!%[#cm
+m!#bTjakm!!%[#cmm!#bTjb"YbC`[+!!B,`Xr2!"NUHFJ8dTS!%aR!2i`I!"#V[j
+H(c`!!5mZrPi[#cmm!&bTjf!!rKC#V[jH)&-I+!"02c`!!8kY%+TBMf!!r0a-haM
+i6Pj1GIckrq$q-2imrDcr@[rJrq$r#%j@rr`[$!aY!!,ZFQmN)'hZE$!YlR*)`1@
+))&!JF!J--#i!$%M!jBJJ8#e`#%crr'!-2@hZF[rm2@i!$2rq)'hZE$!Zrra)`1@
+))&!JF!J-+&"+9'B%F!"J-#"YlQ``,[rm5-$PL#"3)(!)$$!m!Bl"l[rq)&!LEJ!
+)3I!)6("L)YK4b2rm-YK`!5KI6Pj1G8j@rrK)j`%B+'i!#(lrcL`!"6mm!!01V3l
+5)%!!!!!3!!(rr`!!!!3!!!!"!!%!(3#3%a3!![rr!!!!"!!!!!%#J!#3"3J!!!!
+8!!,rr`!!!!3!!!!"!CF!N!8E4&0&9!!!!&3!!2rr!!!!,J")!!%!!!!#!!!!)`!
+!!#m`)Arrrrprrrrr!&J9h!#3&3%!!3#3"3'#(J#3"9J6Z!"B%j`"D!!!!$B!!Ir
+r!!!!+J!!!!)!N"%"!!%!N!D#(J#3$!&S!!!!%!!#rrm!!!!#!!!!!3*SrqJ!!!!
+3!!,rr`!!!!)!!!!"!BRrmJ#3"%C19%d!N!4$9946!*!%4&0963!!!#B!N!m1$9"
+PFQC[FQeK)&9cCA)!N!K)4%j*!!!!"J!!8e4C6!!!!l!!(rrr!!!!(!"!!!&69&P
+-!&J5Z!)"!&J6M!#3"9J5Q!"B%[!!@",i!&J6T!"B%mJ!@"1%!*!)!E8!!2q3"!!
+!!!B!#2rr!!!!,`#3"!3+!!(rN!3!N!Vrr`!!!#J!!3!#"!)!!2rr!!!!!J!"!!%
+!!3!"rrm!!!!"!!)!!`3+!!(rr`!!!!-!!3!"!!)!![rr!!!!!3!$!!3%#J!"rrm
+!!!!"!!%!!3!"!!2rr`!!!!%!"!!&"!S!!Irr!!!!"!!"!!%!!J!%rrm!!!!"!!8
+!"J!"!!$rr`!!!!8!!3!"!!(rN!3!!!!"!!B!"`3*!!(rr`!!!!%!!3!#!!(rN!3
+!!!!Q!!F!#!3"!!$rr`!#!!B!!3!"!!(rr`!(!!!!$!!)!!N%!3!!rrm!#!!(!!%
+!!3!"rj!%!!!!!3!*!!S%!3!!rrm!#!!)!!%!!3!"rj!%!!!!!3!+!!`%!3!!rrm
+!#!!*!!%!!3!"rj!%!!!!!3!,!!d%!3!!rrm!#!!+!!%!!3!"rj!%!!!!!3!-!!i
+%!3!!rrm!#!!(!!-!!3!"rj!%!!!!!3!0!!m%!3!!rrm!#!!(!!3!!3!"rj!%!!!
+!!3!1!"%%!3!!rrm!#!!,!!%!!3!"rj!%!!!!!3!2!")%!3!!rrm!#!!-!!%!!3!
+"rj!%!!!!!3!3!"-%!3!!rrm!#!!(!!B!!3!"rj!%!!!!!3!4!"3%!3!!rrm!#!!
+(!!F!!3!"rj!%!!!!!3!5!"B%!3!!rrm!#!!0!!%!!3!"rj!%!!!!!3!6!"F%!3!
+!rrm!#!!1!!%!!3!"rj!%!!!!!3!8!"J%!3!!rrm!#!!(!!N!!3!"rj!%!!!!!3!
+9!"N%!3!!rrm!#!!(!!S!!3!"rj!%!!!!!3!@!"X%!3!!rrm!#!!2!!%!!3!"rj!
+%!!!!!3!A!"`%!3!!rrm!#!!(!!`!!3!"rj!%!!!!!3!B!"i%!3!!rrm!#!!(!!i
+!!3!"rj!%!!!!!3!C!#!%!3!!rrm!#!!(!"!!!3!"rj!%!!!!!J!D!!X%!3!!rrm
+!#!!(!!)!!3!"rj!%!!!!!3!E!"!%!3!!rrm!#!!(!!J!!3!"rj!%!!!!!3!F!"8
+%!3!!rrm!#!!(!!X!!3!"rj!%!!!!!3!G!!%%!3!!rrm!#!!(!!8!!3!"rj!%!!!
+!!3!H!"S%!3!!rrm!#!!(!!d!!3!"rrm!!!$%!"lrr`!!!!B!"!!"5%&65*!!4A1
+9!!'Pb,(+!!#fdV21!!6!dV2$!!,)eIh1!!-!&b9i!!B""bB(!!J""bB+!!S""bB
+,!!i""bB0!")""bB3!"-""bX(!!N""qN(!!m"#!m(!!X"##B+!!8"#5B(!"B"#bF
+$!!`"#bJ$!"!"#bN$!"3###B'!!d$##B'!"%%##B'!"8&##B'!"F&$#B%!"J&&LB
+%!"N'##B(!"S)##B(!"X+##B(!"`-##B(!"d1##B(!"i!!!&@!"$rr`!!!"3!#J!
+#3dK"8J"B%[3!F2rr!!!!!3!"rrm!N!J-!3#3"3)!N!8"rrm!N!3-!Irr!!!!!3!
+!!!8!!Irk!!%!!!`"rrm!!!!"!!!!&J!"rqX!!!!"$J(rr`!!!!%!!!!L!!(rh`!
+!!!)-!Irr!!!!!3!!!!%!!Irq!!)!!!`"rrm!!!!"!!!!"!!"rrX!!3!!#3%!"J!
+!!!m!N!8"rrm!!3!!#3(rr`!!!!%!!!!)!!(rp`!"!!!*"J!#!!!!!3!!!")!!Ir
+[!!%!!3N"rrm!!!!"!!!!#!!"rrF!!3!!#HVrr`!!!!%!!!!L!!(rh`!"!!)*!Ir
+r!!!!!3!!!!J!!Irh!!%!!!R%rrm!!!!"!!!!3J!"rlm!!3!%#3(rr`!!!!%!!!!
+%!!(rq`!"!!!5!Irr!!!!!3!!!!%!!Irq!!-!!!N"!!!!AJ!0rrm!!!!'!!3!!8K
+"8dJ!!J%,!!%!!J%2!!3!!J%3!!-!!`%)!!F!!`%,!!N!!`%-!!X!!`%1!!d!!`%
+4!!i!!`B)!!J!!m3)!!`!!qS)!!S!"!%,!!8!"3%)!!m!!!&U!"%!$`!"!"3!#J!
+#3d9-6!"B%k`!!2rr!!!!!4rr!!!!!J#3#2rr!!!!%!!!(rm!!J#3#2rr!!!!!3!
+"(rm&!J#3#2rr!!!!!3!%(rX!!J%!N!Irr`!!!!%!!4rq!3)!N!Mrr`!!!!%!!4r
+r#`)!N!Mrr`!!!!%!""rl!!)#!*!(rrm!!!!"!!%IrJ)#!*!)rrm!!!!"!!%Ir`F
+#!*!)rrm!!!!"!!3Iq`!#!`#3"rrr!!!!!3!"(ri$!J#3#2rr!!!!!3!"(rm*!J#
+3#2rr!!!!!3!"(ri%!J#3#2rr!!!!!3!"(rm0!J#3#2rr!!!!!3!$(r`%"!#3#2q
+3"J!"(ri0!J#3#2rr!!!!!3!$(r`%$J#3#h!!%2rr!!!!"J!%!!&)390)!!)Ir`!
+"!!BJq`!$!!BKq`!'!!BLq`!*!3-IrJ!%!J-IrJ!(!`-IrJ!+"!-IrJ!-"!FIr!!
+1""%Ir!!3"3-Ir`!#"`-Ir`!)#3-Ir`!,#`-Ir`!&$3-Ir`!0)!%!N!GH!!2rr`!
+!!"J!#J!#4e*35!"B%l3!!2rr!!!!!3(r!!!"!!%!!!)!!J#3"[rr!!!!(3!!!Im
+"!!%!!!)!!J#3"[rr!!!!!3!4!@i!!!%!!!)!!3#3#5)!!rrr!!!!"J!%!!&)390
+)!"-#E`!#!3)$!3!"!`%"!J#3"!&D!!2rr`!!!'`!#J!#8P9-8J"B%l`!#[rr!!!
+!!3(r!*"Nrrm!!!!F!!!"r`#3B[rr!!!!!J!#!Id!N!4!!*"J)J!$rrm!!!!'!!3
+!!8K"8dJ!!!(r!!%"r`#3"%!#!Id!!J!!!&)!)3!G!!)!!J!%!!*-5e93!!!!(3!
+"!!)!!`!%!!8!"J!(!!J!#3!D!!S!#`!-!!d!'`!1!!m!%!!4!"`!%J!6!"3!&3!
+H!"B!&`!I!"Mrr`!C!!!!a!!&rrm!!!!N!!3!!Nj"688!!!6)XFUK!*!H!JV)XFU
+KbY6,il(Y!*!B!`65Xm1m!*!H"!69rFl%!*!H"365Xmkb!*!V!5!!"2rr!!!!4!!
+%!!*'6P40!!!!!JG$D'PMB@G[!*!j!`!#"NGPEQ9fB3#31K8!!JP)C@afCA4TBf%
+!N$F@!!)(3fpeFQPPFJ#31%983N`!!!"!4Nj863!!(5K$9946!!!G-%4698d!!"d
+i5%4153!!(@C69&P-!!!GF%983N`!!#RSrrlpr2[kqIM`mI,cp2AfpaM+!!!"!!!
+!!8J!!!")!!!!@J#3'3)+b,(+SFS-FfKPCA3ZBhGV,RBd0!)!!J"$9e063Np#6`%
+!rj!%!J"$9e063Np#6`%!rj!%!*!5cl&)Q`!!+M!!!!'L!*!A"365Xmkb!*!V!5!
+!"2rr!!!!4!!%!!*'6P40!!!!!JG$D'PMB@G[!*!I$P"PFQC[FQeK)&9cCA)!N!3
+Lcl(NU`!!!&JFI!2S!!(2XH5V3A9dD&4&@&3$kJ!d!*!($!Y$E'&bDA0AEh*VF`!
+!!3!!!!&)!!!!5!!!!&S!@"53!"E'!!!!(!"D!!*849K8!!!!'R"ZEh3!!!!Q8e4
+5)!!!!$)$k[rr!*!+rrm!!!!5!&J66,rdrrm!!!!i!&J8(&&1:
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_5.0.cwk b/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_5.0.cwk
new file mode 100644
index 000000000..66afd8b10
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_5.0.cwk
Binary files differ
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_6.0.cwk b/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_6.0.cwk
new file mode 100644
index 000000000..8c47d62b8
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_6.0.cwk
Binary files differ
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_DB.cwk b/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_DB.cwk
new file mode 100644
index 000000000..3bcf74cbb
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_DB.cwk
Binary files differ
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_DB_2.0.hqx b/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_DB_2.0.hqx
new file mode 100644
index 000000000..aff66204b
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_DB_2.0.hqx
@@ -0,0 +1,95 @@
+(This file must be converted with BinHex 4.0)
+:#@4KG'%ZBhGV-J"$9d4#3Np#6`#3""Ti!*!%H!8"!%J!3Np#6`!"!"e$i!#3"!-
+B!Q3!$`!5!"N!%J!2!")#r`*5!3!!!3#3%J%!!J)!!!!G3p!!N!F"!!%!!!")!!!
+!%!!!!!%!!!!"!"e$d!#3"!%"!!%!N!N1!"e$a!#3Ba8!!!`"!*!0(82-!`-!N!8
+9!!!-!3!!!!%#!J!!!3#3"3%!!!%!!3!Y!!!!a!!#rrm!!!"F!!!!!J!$!*"E"!#
+3AAJ!$`!!!%J!5!#3"!,`!N$rmIrZ!`N#8Q-#"5J$r!%!!!!"D!&S!*!%$V!,3!!
+"!3!!C!!"!!!!!3!#!!!!!5F2!!%!N!i3!*!*%!$rYIqQ$bd,QJ!)!3#3$4N"!"f
+'4!0@!!!!!3!-!*!+rrm!N!6rr`!"!!%!!!!"!*!&!3!-!!!!!3%K!!!'ZNKZr[`
+[2!!4!)Y1V3fU!!!#3!!!!SJ!N!8"!!%!8J*V,S&)EJ!!!DB0JNKZ!*!%r[a1V3U
++(V`!!!$Lr[`r2!!)6Ud!(8*B!*!*(8*3!*!)B!!!T%KZr[`r2!!)6Ud'bNSZr[a
+FMfF!!)i-,J!Ir[aM"Kem!"rqr%kY"NT#Td*R6Ud'#RVpfNB`"9b2Cb*V)&9!C`4
+U'Q!)!*!%5J"RCMmm!!*1ZJ#3"#!-9)pR9Lm-5'i!N!NG3542l`!+!!!!-J'Q!QX
+!!3!!!3#3"!%!!!%!N!3D!,"J*%kY!"e(`!#3"5K$kJJ(!*!%,c`I4NkY"N)q!3!
+)!*!%60m!(8*F!!!I*!!S!!-"h3*p!!K%8d98!!!!L!!"rrm!!!!N!&J!!J-!!!%
+!(82!!"e$k!!!!"e#e!#3"4e#R!!G3Y!!#3!G3TJ!"`!G3ZJ!N!8"!*!($!)j!DB
+!N!8G3Q!!N!8"!!)!!`#3"d$JRJ!!!!`!N!NG3Q!!N!8"!!!!!3#3#-#H!!!"j!!
+%rrm!!!"f!!!!!34ZB@eP1`!S(k`!+#,)J"8!"NPH!3!"!!%!!3!!+#-I!!J!!@q
+5!#JLRJ!!!MX!(823rrm"9J!2je3!+#-H!*!)!6F!N!3J(@'%)!K!J!!R!*!J"Qj
+eE@*PFLJIV!!S)XL!&3!'59i"!!%!!3!"!!!S)am!#!!"Ej)!+#+H!!!#1`!G3p$
+rr`&@!!rR9!!S)ai!!!%!N!8"0`#3"#!GBB3J#%#!!#F!N#!%C'&dC@9b+"qX!#J
+Lb)!9!!C*AJ%!!3!"!!%!!#JM(`!)!!&[NJ!S)Ti!!!)l!"e$d2rr!9B!$qG8!#J
+M(J!!!J#3"3%h!*!%)"eKK#!)3)!!*`#3)!4dD@ePCA)S(k`!+#,)J"8!"NPH!3!
+"!!%!!3!!+#-I!!J!!@q5!#JLRJ!!!MX!(823rrm"9J!2je3!+#-H!!!$!*!&!6F
+!N!3J(@'%)!K!J!!R!*!M$!!!rrm!!!!#!!!!!3!!!!`!!2rr!!!!!J!!!!%!!!k
+5!!%!!!3)3e4"3J!$!!J!(8&m!"e"a!!G3N3!(8'!!*$r!*$r!*$r!*$f$%026%d
+!N!8G3B3!!!+-3dK15`!)!J!"*!%N!)`!!!#5!*J!RJ$+!3B"(J&'!*"["(4[G'm
+!"(4eG(8!"(4TG'N!+LJJBfpZG'&TER-J0#"QD@9XC(-JEQ&YC5pZG@eLCA)[C'&
+dC5pdD@eP+3!k+#"TEL"QD@9XC#!a1L"dEh4[,(4eG(8XG'PdD5!V)(4SCA0P)'C
+TGQ8JBfpYE@9ZG(29)'aTEQ9c+3!9+#"TEL"QD@9XC#!b1L!c,$3X05!T!!!Q+#"
+TEL"QD@9XC#!c1L!a,c%[0#`J-5mc-5m`0#`J-6)[-5mi15N!(bJJD@iJCQPPE'3
+J0$SJ-cS`-#`J0$S`-#`J06S`-#QSTP%!(6Ym!)rrr`3)Tc8!(6Yi!*!!rrm%#+I
+%!"dlG!#4rrm%#+Lh!"dlF!#5rrm%#+Np!"dlE!#6rrm%#+RE!"dlD!#9rrm%#+V
+$!"dlC!#!rrm%#,%d!"dlB2q3"!!)UeF!N!Err`!)UhB!N!6qFS)!!,3!!!"`!)%
+!N3$`!"e$X2rrYZm%4QPXC341CAI*!%i!!!92F'9Zb3"2!!!(5@jcCA*db3#3"!%
+Y!*!%"80XEh0P!&F!!!46BACP!&-!!!K6BACP)%&cb3"6!)!",3#3"!C0B@0bEh-
+!'i3!#deKD@`J6@9bCfA*!%d!J!%Y!*!%#e"KCf8J8f9dGA$*!*!%"P"bD@jdb3"
+3!!!",3#3"!44G@Pd!&%!N!3-3dp-63#3"4e"N!!!!!+-3dK15`!$!J!"h!(F!)`
+!!!#B!+3!N(L#J%!!`!#3"i!33!'!!*!(J""!!D!!N!G1ZJ'k3TFr2!!%6Ud'`NK
+ZrrBr2!!%6Ud(!Nr[!!aJ!!&3$%B!#@B!!+C#V[rb3LFI2!!"5'lrmLm-2c`!2+R
+R2A`!rrrq5'lqmdKZrri[,[rb,``r2!!iUHFGE[rrr[*)E[lb6UdBmMJ!GJ"FMf!
+b)'hMl(!'`--J8"S`#%T)K3a&!!0R"Ja&!!9Q&#"Yiqa`"X$$)&"b!")`#%Zi3@G
+D8N-JEH2X)&#f8'A%,c`"p3!"6Ud'FMi!98"BMfF!!,)-4`!$CJ4`"f!#F!Nm!%k
+Y"NT#Td*R6Ud'#Mk%F2c34Mm!3UG1V4P#)'hMj#"32UJ!3%kY&q*J!!#k,c`!P3!
+86Ud+UPL2B'K1V3C+B!!!T,a(Ce`-4`!*CLJ[2!!$!3"1ZJ#D(V`!!5m-3QHTjd+
+R2c`!"%kY"X*)E[rfU5K3Mf!X$%B!#@BQ,c`!!`!!6VS!E%)A,`a#CkRR5'd'XMm
+m!!41V3E#5'lrpUNS8)mm"d+Zrr)-4J!*CKT#*amm!!&)E[rb,``r2!!mUHG+(fB
+%F!"J!R!"(`!r2!!"6Ud'UPL22c`I3NkY"N)q!&52CJ$pRNcZ%2MqfNjH6R919[r
+b,cJ*eMmZ!!K)E[rq5'lrqNKZrr+TM8SZ!!TR#!!!!!a$6da0!*!&(8'S!!!#M%0
+)6NX!!`)!!G`"h!#-!!!!Q!#N!*"iJ""!,3!!!!%G@J!!Rrp!,3!!!!%GPJ!!J""
+!,3!!!!)5K!!!!!*PX!!De8L!8!!!rrm!%J"-!!%!N!G)!!!!5!#3"3J!!3!)!*!
+'(a!!N!4R,!!!!"3!!Q@J!"-!hJ#)!Bi!(8'!!!!!&!!#CE!!!3#R!"-!jJ!G3A`
+!!!!m!!*PU!!De8L!4!!!rrd!%J!r!!%!N!G)!!!!5!#3"3J!!3!)!!!!!Qhm(a!
+!N!@m!!!!&!!#CD`!%`#N!!*Yj!!G3A3!!!!m!!*PS!!Qf3#!T!!!!!*Yc!#M!!%
+!N!G)!!!!5!#3"3*YY!!)!*!'(a!!N!8`!!(3T!!#ECa#4Q"!5-B["Lm-6VS!B$S
+!8%pR"!!#EB4`!#m!,`X[$%kk!33B!(!!%!4+J!!#E@aQ"(!!B#a`!"!%$%!!!@F
++-!C54J!#E94YZVaZrrjQ$L"8)NJ`+3!`5-$4U!!#E6cr3%cZ'2$rj%jH6R919J!
+!51F$#!!#E53SEJ!)5SGY$#m-6VS!E,#(@%pZ"($CB&BJ9$!S!$")`#)!)!G1V3K
+L,J!J9#&(!$BJ9,kS!#"Q%L*)-#N!-%M!X+J!*'B%F!"J*#"8-#J!-%M!,`!["bm
+-6VS!e$`!6qm!$'F))&4`rb&!!$B`"NcZ!!!!$%026%d!N!8G3A3!!!+-3dK15`!
+$!J!"h!(F!)`!!!#B!+3!N(L",%!Y!*!'3!#!"N!Y!*!'99@#J%!Y!*!'DUXq(dL
+%5-3["#m-6VS!K%T(6qm!('B-)&3K43!J)&3K4J!N-!G-lK$`rqa1ANje6PB!!%M
+R!3JSEJ!))&3JD!!FS'NH!#"8)'J!(+!T%!G-lK#!rrK1ANje6PB!!#m(,Li!%'B
+%F!"J)#"Z!!JJ8#mS!!S[,J!-,bi!&#m(F!'S)P@2UDmq(c!(,Llrr%jH6R919J!
+!51F"##KZ!!JJ9#"S!"bJD4i!)&3JD!!F%#i!$k"U%!G-lK#!rrK1ANje6PB!!#m
+-+'i!##"85UJ!#QB%F!"J0L"85LJ!'QBS,bJ!"%kY%b*)`&L2,`!J9#mS!!S!!QT
+i)&3K3!!@)&34I!!"!"T36b"8)#J!!QTJrra1ANje6PB!!%MR!aJX,J!-+'i!!QT
+)F!!K3!!F)&3K3!!N)&3K3!!J)&3!!QS`,`C1V3"k*N"9Mcki!L!q(fF%-!F!!QS
+B)8X!(#"8)@i!%!!J)&3K4J!NF!!!!QS!rr"1ANjeB#F!!!G)!%jk`$%J!!T19J!
+!,``SEJ!)F!!S`#L!+'lrr%jH6R919[ri51F!'%KZrrK1Z[rD+(J"'#(i!UB"'#C
+-@Bm[,J!)5'lrq%KYpGT`!"m!FJ!r!6m"2`&`%$m!F!![!+P8+&mJ5`!!!"!!!Ir
+r!!!!"!!!!!%!(8-i!!!!8!!"rrm!!!!'!$i!!3!!!!)!!3!!!3!!!3K-BAP[GA3
+J-F`!'YcJ!*!%#!"!J00@!#JJq!!E!"X!!!!(!"e#N!!!!3"4!*!'""d!!3"4!!!
+!*J!%rrm!!!!'!!)!!33!!!%!!)N!!!-!!)N"!!8!!)N#!!F!!)N$!!!!0J!)rrm
+!!!!%!!S!!3!(rrm!#!!)!*!%9CS!!N#+!!0![!!%3)S!"8#+!!C!LJ!(3'3!#%#
++!*!(%J!"rrm!!!!'!!!!!3!!!!-!!%46493!!!'%!!Mrr`!!!#B!5!!"!!!!!J!
+!!3#3"hrrrrprrrrr!"e$5!#3&3%!!3#3"3%IT!#3$!%S!A8!"`!!"J!!!$m!!!!
+5!!!!K`!!!!8!!J)!(3!!!!-!N!4KK!dm!!B!!!3!!!#3!!!!!")!!!'-!!!!!3!
+#!J!!!#!!!!!9!!!-!3%!!!F!!"J!!!!r!!!!*!!!!)F!!!!&!!)#YdB!!!!%!*!
+'$6`!"J!!&J!!!*!!!!!!*!!!!0J!!!!"!!)#!!!!)!!"!"8!!!`"!3!!"`!!+J!
+!!$m!!!!f!!!!K`!!!!8!!J+hNJ!!!!8!N!B02!!'!!!S!!!!N!!!!!!f!!!!f!!
+!!!%!!J)!!!!J!!)!&3!!$!%"!!!(!!!m!!!!2`!!!%J!!!#(!!!!"3!#!VIH!!!
+!"J#3"Jdm!!B!!$S!!!#3!!!!!%J!!!$B!!!!!3!#!J!!!#!!!`!9!!!-!3!!!'!
+!![rr!!!!+J!!!!)!N"%"!!%!!!!G3p!IT!#3$!%S!*!4!3!"!*!&!AUq!*!-!5J
+!N""%8d98!!!!5!!"!*!)JJ!"!!!$!!!!!J!!!!3!!3!"!!%!!!!G3M3!(8)S!"e
+#,!#3#8J!$!!G3D!!!3!-!*!,"J#3"3%!!!!+!*!&&3!"#J%!N!F+!*!&"3!G3MJ
+!!!!&EQ&YC3"%8d98!!!!5!!"!*!)JJ!"!!!%!!!!!J!!!!B!!3!"!!%!!!!G3KJ
+!(8)F!"e#%!#3#8J!$!!G3G!!!3!-!*!(!J!!!!B!N!8"!!!!#J#3"48!!3S"!*!
+(#J#3"3F!(8)N!!!!"fjeE@*PFJ"%8d98!!!!5!!"!*!)JJ!"!!!&!!!!!J!!!!3
+!!3!"!!%!!!!G3I3!(8(m!"e"i!#3#8J!$!!G3CJ!!3!-!*!("!!!!!B!N!8"!!!
+!#J#3"48!!3S"!*!(#J#3"38!(8))!!!!"@4KG'8!4&0&9!!!!%J!!3#3#))!!3!
+!"J!!!!)!!!!%!!%!!3!"!!!!(8(B!"e"T!!G3K3!N!P)!!`!(8'F!!%!$!#3"`B
+!!!!'!*!&!3!!!!S!N!89!!%+!3#3"`S!N!8&!"e"h!!!!!9dD@eP!%46493!!!"
+8!!$rr`!!!#B!5!!"!!!!"`#3"hlEEArrrrprrrrr!"e#P!#3$3Zi!!!,Z!!!!3!
+"!*!&!4qN!*!-!5J!!!!f!!(rr`!!!#S!!!!#!*!4!3!"!*!'(k3!N!`"+!#3#!%
+2S%)VC3!!:
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_DB_4.0.hqx b/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_DB_4.0.hqx
new file mode 100644
index 000000000..b855dcb38
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_DB_4.0.hqx
@@ -0,0 +1,134 @@
+(This file must be converted with BinHex 4.0)
+:#@4KG'%ZBhGV0!"$9d4#3Np#6`%!!!!R%3!!!D,F(!3!R!"#6d*2!!%!@"A8!*!
+%!aJ#C!!2!")!'3!5!!m!%J,r!P)"!!!"!*!5!3!!!J!"!!!!@",S!*!("`!"!!!
+!!3!"!!!!5!!!!"!!!!!"!!!!!3"B%ZJ!N!3"!3!"!*!*$J"G!*"T&3!!$!%!N!p
+B%l`$!rrr!!!!"3!!!Im"!!%!!!)!!J#3#J%!!!%!!3!Y!*!%!3#3"&S!!!!S!*!
+&"J%!N!3"!!%!N"N1$9"PFQC[FQeK)&9cCA)!N!pi!!m!!!")!%J!N!3#m!*!rr(
+rlJ-*!P*M!J8S!r`"!!!!!@J"D!#3"!k`#d!!!3%!!'3!!3!!!!%!!J!!!!%R$`!
+"!*!1%!#3#4!!rlArTJmY#jS!#!%!N!dC!3#3#a`!!2rr!!!!"!!3!!%!"3!!!3!
+"!3!!!3#3#PMYi!0@!!!!!3!-!*!+rrm!N!6rr`!"!!%!!!!"!*!&!3!-!!!!!3%
+K!!!'ZNKZr[`[2!!4!)Y1V3fU!!!#3!!!!SJ!N!8"!!%!8J*V,S&)EJ!!!DB0JNK
+Z!*!%r[a1V3U+(V`!N!6qr$mm!!K1V3"B%X`!N!PB%J3!N!KJ!!#N5'lqr$mm!!K
+1V3E+5Llqr&b2C`!!MJ`Z!"rqr'-'(A`!(rlm6Ud'5N+R3QG1V3B+H[hD4M!&A)p
+R)QXJ98"R"'SDB!J!N!4+!'GQ2c`!!Nkk!*!%)!a8MfG@,`a)EJ#3#9J4V%r[!!S
+!!!"3!DB#D`!"!!!"!*!%!3!!!3#3$&N23!#3"@NR8JX!N!FI4NkY"N)q!3!)!*!
+%60m!@",N!!!I*!#3$2q3#!!S!!-"h3*p!!K%8d98!!!!V!!"rrm!!!!U!(B!!J-
+!!!%!@"-X!&J5[!"B%VJ!!!"B%S3!N!9B%Y`!@",X!&J6$!"B%V3!@"-N!!N!@"+
+3!!!(!*!*!3!2!")!'3!5!*!(!`)E!DB!N!9G!&J5i!"B%S!!N!8"!!!!!3#3#1#
+H!!!!!`#3#4d!@",!!!"#B!#3"3%!!!!"!*!)`*i!!!+m!!6rr`!!!+`!!!!""'j
+KE@8l!#JIV!!S)XL!&3!'59i"!!%!!3!"!!!S)am!#!!"Ej)!+#+H!!!#1`!G3p$
+rr`&@!!rR9!!S)ai!N!J"0`#3"#!GBB3J#%#!!#F!N#!#!*!%@"0B!*!Z"QjeE@*
+PFLJIV!!S)XL!&3!'59i"!!%!!3!"!!!S)am!#!!"Ej)!+#+H!!!#1`!G3p$rr`&
+@!!rR9!!S)ai!!!%!N!8"0`#3"#!GBB3J#%#!!#F!N#!#!!!!Irm!N$!%C'&dC@9
+b+"qX!#JLb)!9!!C*AJ%!!3!"!!%!!#JM(`!)!!&[NJ!S)Ti!!!)l!"e$d2rr!9B
+!$qG8!#JM(J!!!J#3"3%h!*!%)"eKK#!)3)!!*`#3)!)!!!"rr`#3-!4dD@ePCA)
+S(k`!+#,)J"8!"NPH!3!"!!%!!3!!+#-I!!J!!@q5!#JLRJ!!!MX!(823rrm"9J!
+2je3!+#-H!!!$!*!&!6F!N!3J(@'%)!K!J!!R!*!J!J!!!(rr!*!c!3#3"!`!!2r
+r!!!!!J!!!!%!!!!-!!$rr`!!!!)!!!!"!!!1NJ!"!!!%#%0838)!!`!)!&J5X!"
+B%UJ!@"+J!&J5Q!#3r`#3r`#3r`#3pJa$6da0!*!&@"+X!!!#M%0)6NX!#!)!!43
+"&!#-!!!!P!#F!+3!dJ%3!5S"9!#3E`B!"(4[G'm!"J!%G(9dG3!'!!4dDA4T!#`
+!+LJJBfpZG'&TER-J0#"QD@9XC(-JEQ&YC5pZG@eLCA)[C'&dC5pdD@eP+3!m!$S
+S)'PZ)'CTC@aN)$%k)(4[G'mXG(9dG5adDA4T)#XJG'KPFf8JCQPfC5"MEfeYC@j
+dFp8JE'PZCA-T!"J!&5JJD@iJCQPPE'3J-MSJ-b`d,$8J+3!!+!!Q+#"TEL"QD@9
+XC#!c1L!a,c%[0#`J-5mc-5m`0#`J-6)[-5mi15N!)J!I+#"TEL"QD@9XC#!d1L!
+c1M!`,#!d1M!`,#!e1M!`+DM"l[rq)&!LEJ!)3I!)6("L)YK4b2rm-YK`!5KI6Pj
+1G8j@rrK)j`%B+'i!#(lrcL`!"6mm!!01V3l5)%!QD!!)##`!!!!19)pRI!`(!$&
+PGJ`(!$PLF%+ZrrK`!"!("N$rcce!rrJJ8c!ZrrL`D!"-E&*#V[rm3LFI2!!"5'l
+rr#m,2c`!2+RR3KF[,[rm,`Xr2!"FUHFI2!!",blrq#m,2c`!A+RR,`Xr2!!3UHF
+JEJ!--,`!!h$r1d#l)$Y!Zaj`!@!%3P4`!%cI')"1ANje6PErmLmZ!!Sr,J!)5'l
+rpNKZrr*)E[riUBe)E[riU+0)E[ri,c`!!3!"U+N[,J!+U(01V3Pb5UhZG'F@)'h
+ZG%KS!!%!!!!-3dp-63#3"9J5T!!!!Sa$5%j,!!-#!!(@!GB!M!!!!*S!U!#3H3b
+#J%!!`!#3#!b!%%!"J!#3#!b!%%!"S!#3"b"32bJ!)%kY!rT+3&52C`j)E[rd,`Y
+1V3j58)pJ$%KZrr3[#dkY$PT3Mb",S#T+,J!3C`j`Im!i#6J4`!Ni,`bST#!(`Be
+-haM!6Pj1G8j@rr3[$%KZrr3r2!!$6Ud4%M!ZrrU3!'lrpJC!rqmp32rq2A`!&2r
+mF!JZJ%KZrr41V3Mk5'lrp%+R,c`!!3!"U+FZ[))!!3")E6h#,blrr%KZrr3r2!!
+$6Ud2-LK!)!`SE[r`6Pj1G8j@rrT)j`-B+'i!#%+R,``r2!!NUHFJ6+!T,a5SSb"
+-S#SGI!!'rrT#E[rm3QlrrL"YlQ`Q8$!YlR+`8f4)-#hZFL"c"!`J8$i3I!"J0%*
+R2c`!!6mZrr`[$$mm!!LTjaeZrrhrqdKZrrSr2!!#,blrr#m-2c`!@+RR8Qlrr&5
+28NDq4Q,)60mB`%jH6R919[rm,``SEJ!)5'`!MLmZ!!a)E!"15'`!#%kY2[T+,!"
+16qm!%'B15'`!6NKX!!j1V4E58)mJEJ!-5K"Q$LmZ!!`[2!!D!+*1V4,L5L`!MQB
+85'`!MMmm!+*`(0"X!!)r!%kY%Z)SAdjH6R919[X!51FI'(i"3Qlq"NKZrF"1V41
+b3UhZE#km!"!!!6mm!!41V3!!!!a$6da0!*!&@"+F!!!#M%0)6NX!!`)!!GB"eJ#
+-!!!!QJ#S!*"j$*ES3#d!!!!"(9S!!!!-J!&!,3!!!!%GPJ!!!!b!J%!Y!!!!!K+
+%!!"53&#2Ca*)E[ab,bhZE%kY&fT53&#2CJC`!'!!"+T)H!"X5'lrP%kY#2T)E[f
+!,c`!#c,06Ud5iNKZrAT1V42#,#lpI$eZrAVrUN(Zr(SY52qQHJ"2l`!-B!!"5K!
+e85$ZCNR!28$q#%KZr(Sr2$,0F"h3E[i)2`"1V4,L3QFr,[qU,`C)E[ak5'lpHM!
+m!!'U8NKZrAT1V3K55J"FMfBD3QFr,[h!,blp`NKZr(T)E[ek-$`!!DT59)p)E[e
+k6Ud)8NS!@)pR!!#D2A`!![i'5'lqP$mm!+*`%p"&2`"1V4,L3Hlq$N2ZrAT`%#$
+C8FMrr$$C5'lq9$mm!+*`!G"&2`"1V4,L2`9)E[i',blmENkY&hT53%r[!!TQ"R!
+!B!!$TN*ZrJC)E[j82c`!SR!(d%8r!%kY%Z*)E[k82c`!SR!0d%8r!%kY%Z*)E[i
+',blmENkY&fT53&#2CNC`!'!!!fC)E[j82c`!SR!"d%8r!%kY%Z*)E[k82c`!SR!
+0d%8r!%kY%Z)r"8KZrJB[,[aZ6UdAHP*!6qm!#QB'F!"J!!-Q8N8-43!'E3$qXMe
+m!!(q"NUYr14R!!%XHJ"J!!%3)'hmj$!m!@V"a5"33qll"%(`#""`@3!!!!a$6da
+0!*!&@"+8!!!#M%0)6NX!!`)!!GB"eJ#-!!!!QJ#S!*"j$*(!!*!,$*(!!*!,$)+
+!3#d!N!CUU`#3#2rr!!!!!3%%!!!"!*"Krrm!!!!"!JJ""!%!N!JN!*"Brrm!!!!
+"!JJ""!%"!*!(5!#3@2rr!!!!!3))!33"!J#3"f`!N&Mrr`!!!!%##!%%!3-!N!H
+3!!#3$4!!!Irr!!!!"!!!!!%!@"+-!!!!AJ!"rrm!!!!'!%`!!3!!!!)!!3!!!3!
+!!3K-BAP[GA3J-F`!'YcJ!*!%#!"!J00@!#JJq!!E!"X!!!!(!&J5L!!"!&%!N!F
+2!")!'3!5!*!'""d!!3"4!!!!*J!%rrm!!!!'!!)!!33!!!%!!)N!!!-!!)N"!!8
+!!)N#!!F!!)N$!!!!0J!)rrm!!!!%!!S!!3!#rrm!!`!)!*!%43i!!N!1!!0!$J!
+%3!i!"8!1!!C!$J!(3!i!#%!1!*!,%!!"rrm!!!!%!!!!!3!!eX!!!!!3!!(rr`!
+!!!3!!!!"!!!!!`!!!#`!"2rr!!!!"J!)!!(rN!J!!!")!!J!!3")!!J!!J")!!J
+!!`")!!J!!!!3!!$rr`!!!#3!"!!"8dp59!!!!"!!!2rr!!!!KJ!%!!&58&*8!!!
+!%J!!rrm!!!!Q!!B!!9053dMrrd46493!!!(%!!Mrr`!!!#i!5!!"!!!!!J!!!3#
+3"hrrrrprrrrr!&0)D!#3&3%!!3#3"3%IT!#3$!%S!3!!"`!!"J!!!$m!!!!5!!!
+!K`!!!!)!!!)!!J#3"3-!N!4KK!!*!*!%#J!!"J!!"!!!!*!!!!!!%J!!!B`!!!!
+"!!!#!!)!N!F9!!!-!3!+!*!%!3!!"`!!'!!!!$m!!!!N!!!!K`!!!!)!!!)!!J#
+3"33!N!F*!*!%#J!!"J!!&J!!!*!!!!!!*!!!!0J!!!!"!!!#!!)!!!!"!!%!&3!
+!$!%!#J#3"!%!!!F!!#S!!!!r!!!!0J!!!)F!!!!#!!!#!!)!N!8&!*!(#3#3"!S
+!!!B!!#J!!!#3!!!!!$B!!!$B!!!!!3!!!J!#!!!!!J!#!"8!!!`"!!S!N!3"!!!
+(!!!m!!!!2`!!!%J!!!#(!!!!!J!!!J!#!*!&"J#3"`N!N!3+!!!'!!!k!!!!N!!
+!!!")!!!!f!!!!!%!!!)!!J!!!!-!!`!9!!!-!3!+!*!(B!!#rrm!!!!U!!!!!J#
+3%3%!!3!!!&J5k"qN!*!-!5J!N"%"!!%!N!8"HVi!N!`"+!#3%%46493!!!"8!!%
+!N!L#!!%!!!-!!!!#!!!!"!!"!!%!!3!!!&J5E!"B%R3!@"*N!*!(@"*`!*!&5!!
+-!&J6`!!"!!`!N"%)!*!&#`#3"3`!N!8#!!%+!3!2!*!(#J#3"38!@"*S!!!!"@j
+KE@8!N!4D!!(rr`!!!%i!!!!"!*!0!3*!!*!P!3!"!!!"!*!64&0&9!!!!&3!!3#
+3#))!!3!!"!!!!!)!!!!'!!%!!3!"!!!!@"*B!&J5B!"B%P!!N!GB%P`!N!9)!!`
+!@"(X!!%!$!#3"`)!N!N)!*!&#`#3"3`!N!8#!!%+!3!2!*!(#J#3"3F!@"*8!!!
+!"fjeE@*PFJ#3"&S!!Irr!!!!6J!!!!%!N!d"!N!!N#8"!!%!!!%!N"0%8d98!!!
+!9!!"!*!)JJ!"!!!&!!!!!J!!!!3!!3!"!!%!!!"B%N3!@"*-!&J52!#3"eJ55!#
+3"8J!$!"B%E3!!3!-!*!("!#3#3J!N!8,!*!&$!#3"3)!!3S"!!m!N!F+!*!&"3"
+B%N!!!!!&C'&dC3#3"&S!!Irr!!!!6J!!!!%!N!d"!N!!N#8"!!%!!!%!N"0%8d9
+8!!!!9!!"!*!)JJ!"!!!'!!!!!J!!!!3!!3!"!!%!!!"B%M!!@")i!&J5+!#3"eJ
+50!#3"8J!$!"B%E!!!3!-!*!("J#3#3J!N!8,!*!&$!#3"3)!!3S"!!m!N!F+!*!
+&"3"B%L`!!!!&G'PYC3#3"&S!!Irr!!!!6J!!!!%!N!d"!N!!N#8"!!%!!!%!N"0
+%8d98!!!!9!!!rrm!!!!Z!%J!!3!!!!F!N!GqfferrrrrIrrrr`"B%L3!N!d,Z!!
+!#lJ!!!%!!3#3"3%IT!#3$!%S!!!!0J!"rrm!!!!U!!!!!J#3%3%!!3#3"KqN!*!
+-!5J!N!a'6P40!*!%3e988`#3"%4698d!!!!Q!*!2$Je3CA*QEh*YB5"9Ff9b!*!
+)5%4153!!!!B!!&08@8`!!!(8!!lrr`!!!"`!3!!"8e4C6!"B&EJ#!3"B&E3!N!9
+B&E`!@"@N!&J9c!"B&D!!@"2%!&J6d!#3#!%!!!$rN!3!!!!'!!,rr`!!!"m!N!3
+%#J!"rj!%!*!+rrm!!!!#!!%!!J3#!!$rr`!!!!)!!3!"!!%!!Irr!!!!!3!#!!-
+%#J!"rrm!!!!$!!%!!3!#!!,rr`!!!!%!!`!%"!S!!Irr!!!!!3!"!!%!!3!$rrm
+!!!!"!!3!"33+!!(rr`!!!!3!!3!"!!)!"2rr!!!!!3!&!!B!!3!!rrm!!!!&!!%
+!!3!"rj!%!!!!!3!'!!F%#3!"rrm!!!!"!!%!!J!"rj!%!!!!"!!(!!J%#3!"rrm
+!!!!"!!%!!3!"rj!%!!!!"!!)!!N%#3!"rrm!!!!"!!%!!`!"rj!%!!!!"!!*!!S
+%#3!"rrm!!!!&!!%!"!!"rj!%!!!!#!!+!!X%#3!"rrm!!!!"!!%!!3!$rj!%!!!
+!"!!,!!m!!3!!rrm!#`!(!!%!!3!%rrm!"`!!!!)!$!!3!!N!!Irr!!!!!3!"!!%
+!!Irr!!`!!!!"!!d!%3!"!!$rr`!3!!%!!3!"!!(rr`!!!&J!$2rr!!!!"J!%!!&
+)390)N!"&Fj8!!DA)XFS!!,E5Xmi!"-$5Xm-!!XM9rFi!!`!**BN!#3!**SF!#!!
+A*AJ!"J%'*JS!$3%)*JS!"3%)+!X!#`-'*JS!#J!!!,B!#!!'!!%!&!!+!!*$5%&
+5!&J9R!!!rrm!!!!"!!(rr`#3#!`"!*!&"`#3"3(rr`#3"!`"rrm!!!!"!!!!"3!
+"rrS!!3!!$!(rr`!!!!%!!!!@!!(rk`!!!!%1!Irr!!!!!3!!!#)!!IrI!!!!!J`
+"rrm!!!!#!!!!!3!"rri!!J!!$!(rN!B!!!!6!!(rlJ!#!!%-!Irr!!!!!3!!!"F
+!!IrU!!)!!3S"!!!!0!!'rrm!!!!'!!3!!8K"8dJ!!J%,!!%!!J%2!!3!!J%3!!-
+!!`%,!!)!"!%,!!8!"!%-!!F!!!!q!!,rr`!!!"3!#J!#3d9-6!"B&E!!QIrr!!!
+!!4rr!!!!!J#3#2rr!!!!$3!!(rm!!J#3#a`!![rr!!!!"J!%!!&)390)!!)Ir`!
+")!%!N!H1!!Arr`!!!"J!#J!#4e*35!"B&D`!!2rr!!!!!3(r!!!"!!%!!!)!!J#
+3"[rr!!!!#J!!!Im"!!%!!!)!!J#3"[rr!!!!!3!4!@i!!!%!!!)!!3#3"[rr!!!
+!!3!$!A`!!!)!!!)!!J#3"[rr!!!!!3!"!Ai!!!%!!!)!!J#3#5i!"Irr!!!!"J!
+%!!&)390)!!-#J!!%!!8$IJ!$!"-#E`!#!3)$!3!"!`%"!J#3"!)b!!Arr`!!!'`
+!#J!#8P9-8J"B&#!!-rrr!!!!!3(r!*"Nrrm!!!!*!!!"r`#3B[rr!!!!!J!#!Id
+!N!4!!*"Grrm!!!!"!J!"r`#3B[rr!!!!!3!!!rm!N'8Z!!Arr`!!!!B!"!!"5%&
+65!!!!Im!!3!!!rm!"!(r!*!%!J!"r`!$3!)"r3!#!!!!0!!5!!%!"!!#!!3!!Na
+,99!!!!!-!!%!!J!$!!3!"3!'!!F!#!!*!!S!$3!1rrm!#`!-!!d!!!$%!!Arr`!
+!!#3!"!!#6N&043!!"-LabU%!N"i##XLabU(+e-[MXHd!N"J$"0+c`l`!N"i%"0A
+pcX3!N"i&"0+ccV)!N#cF!!2rr`!!!%3!"!!#4Nj863!!!!)(3fKTBf&RE`#313-
+!!JC(C@jPGQ%!N$S9!!)*5'9XGQ9dD@0K!*!f494#6!!!!%"'6P40!!!Gh8099&-
+!!"hP4&0963!!(He)4%j*!!!H'e08@8`!!"iP494#6!!!*XRrr[hmqrVjq2$am[2
+dpIEhD9i!!!%!!!!"5!!!!%J!!!"D3#a1A&jdCX4PG&m%3!4rr(rJIr"rq(rmIrp
+rrhrrIri*C'&dB5jMGfXd!J!!!%0A4%*#6d*2!*!-3eG%3N*23Nm!N"M2Xdk#!*!
+'!D)!N!Ell*!+!*!'qrX!N!hll*!+!*!'qrMl!*!-qqb3#J#3"[X!q2X!N![ll*!
++!*!'q`!!q2X!N!8V!!!!$P"PFQC[FQeK)&9cCA)!N!3Lcl01JJ!!!&M[l!2S!!(
+2Xdk#3A9dD&4&@&3$kJ!d!*!($!Y$E'&bDA0AEh*VF`!!!3!!!!&)!!!!5!!!!&S
+!@"58'9J!!!!F!&S!!P4&@&3!!!!DF'j[G!!!!#C69&)J!!!!-J2Urrm!N!Vrr`!
+!!")!@")-[r6rr`!!!$J!@"'%MUX!:
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_DB_5.0.cwk b/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_DB_5.0.cwk
new file mode 100644
index 000000000..ff33586f3
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/pass/ClarisWorks_DB_5.0.cwk
Binary files differ
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/pass/MicrosoftWorks_2.0.hqx b/writerperfect/qa/unit/data/calc/libmwaw/pass/MicrosoftWorks_2.0.hqx
new file mode 100644
index 000000000..606719746
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/pass/MicrosoftWorks_2.0.hqx
@@ -0,0 +1,45 @@
+(This file must be converted with BinHex 4.0)
+:#R0SC@9d,RGVFc)!39G68e"656)"!!!!#Fm!N!3NZ3!!!!J!2J!%!FB#2J!!"@S
+!!`#3"`%!N!B)r`!'!!N!A@Ni!(i!N!FY!G3!N!8*!!!*!J#3"`-!N!FX!!%!K!!
+#!0`!!`%d!!3"M!!&!H5!"J+S!!F$!!!)!eJ!#31`J!S%#!!,"'!!$!5i!!d&%!!
+1"@L!$`A!!"!''!!4"R!!%JE)!"-())!8"hJ!&3I3!"B)+!!A#)!!'!MBJ"N*-!!
+D#BJ!'`RJ!"`+1!!G#T!!J"i+k!!I#d!!)!ZB!#%,m!!L$%L!)`bJ!#3-q!!P$9!
+!*JfS!#F1!)!S$PJ!+3k`!#S2#!!V$f!!,!qiJ#d3%!!Z%'J!,a$!!$!4'!!a%A#
+!-K()!$-5)!!d%RJ!04,3!$B6+)!h%i!!1"2B!$N8-!!k&)J!1a6JJ$`91!!p&C!
+!!$i9k!!r&N!!3"DBJ%%@m!"#&dJ!3aHJ!%3Aq!"&'&#!4KLS!%FC!!")'9J!54Q
+`!%SD#)",'Q!!6"Ui!%dE%!"1'fJ!6a[!J&!F'!"4((!!8Kc)!&-G)!"8(AL!94h
+3!&BH+!"A(S!!@"lB!&NI-)"D(iJ!@arJ!&`J1!"G)*!!!&iJk)"I)8!!B#'B!'%
+Km!"L)NJ!Bb+JJ'3Lq!"P)e!!CL1S!'FN!!"S*&L!D55`!'SP#!"V*@!!E#@i!'d
+Q%)"Z*QJ!EbE!!(!R'!"a*h!!FLI)J(-S)!"d+(J!G5M3!(BT+!"h+B#!H#RB!(N
+U-!"k+SJ!HbVJ!(`V1)"p+j!!!(iVk!"r,%!!J#bB!)%Xm)##,8J!JbfJ!)3Yq!#
+&,P!!KLkSJ)F[!!#),eJ!L5q`!)S`#!#,-'#!M$#i!)da%!#1-@J!Mc(!!*!!-KL
+!N6*`!*)bb!#6-b!!P$0i!*8cd)#@0#J!Pc5!!*Jdf!#C06!!QM@)J*Xei!#F0MJ
+!R6D3!!#H0ZJ!RcG!J+!hQ!#K0r!!SMK)!+-iS!#N12L!T6P3!+BjU!#R1J!!U$T
+B!+NkX)#U1`J!UcYJ!+`lZ!#Y2"!!VMaSJ+mm`!#`24J!X6e`!,)pb!#c2L#!Y$j
+i!,8qd!#f2bJ!Ycq!!,Jrf)#j3$!!ZN#)!,Y!i!#m36J![8'3!)#q3HJ![d*!!-"
+#Q!$"3[!!`N0)J-0$S!$%3rJ!a843!-C%U!$(43#!b%9B!-P&X!$+4JJ!bdCJ!-a
+'Z)$04a!!cNGS!-p(`!$35"J!d8K`J0*)b!$655!!e%Pi!09*d!$@5LL!edU!!0K
++f!$C5c!!fNZ)!0Y,i)$F6$J!h8b3!!$H61J!hde!!1"0Q)$K6I!!iNj)!101S!$
+N6[J!j8p3J1C2U!$R8!!!k&"B!1P3X!$U83L!ke&J!1a4Z!$Y8K!!lP*S!1p5`)$
+`8aJ!m90`!2*6b!$c9#!!p&4iJ298d!$f95J!pe@!!2K9f!$j9M#!qPD)!2Y@i!$
+m9cJ!r9H3!!$q9qL!reK!!3"BQ)%"@A!"!J#3r`#3"`hX!#`!!!!"!!%!!3!"2ri
+"!!!$!!S!!!!K!*!A+!YZEh*YB@`!!)!#B`PLEfaN!!#!!R-1G@jNCA*XD@jP!!#
+!!Q[q![m!!!"(45KQEfjd,f0[E'pb,h0THQ8JBf&Z)'*P)'4PCQPZC@3JEfjXH5"
+QEh)JG'KP)(GSEfaP)(0`FQ9KC(0SC@9d)#N!!)!#Brm!!!!Y#Q&XD@GZ!!#!!Q-
+*E'9QG!!!J!)$#f0PER4PFJ!!J!)M#R*TCfKd!!#!!N2r!!!!(4YcEfeP)'jeE@*
+PFQPZCb"QEh*YBA4c!!#!!Q2r!!!!Fa)`,M)rr-b3#!!!J%*M%M!Z-Mrmc*!)!!#
+!3Q!5-#ib2rc-N!J!!)"#B4)`,M)rr-b3#!!!J%*L%M!Z-Mrmc*!)!!#!3Q35-#i
+b2rc-N!J!!)"+B2m!!!!M)A0[E@8JC'&dC5"KEQ3JG'PYC5Gc)'C[FQeKG(-!!)!
+#Brm!!!"I'$%b,c-[-M!`0%!Y!!!!!4rm!*!%J%*P'$%b,c-[-M!`0%!Y!!!!!4r
+m!*!%i%*Q'$%b,c-[-M!`0%!Y!!!!!4rm!*!%`%*Q%M!Z16rqjQD3"`!!J%*Rr`!
+!!"-4FfpYC5"QEh*YG@aK!!#!!Q2r!!!!LLF)!6%rri!!N!F@!!N"!!$r!!!!&$r
+rJ!#3#B##BcS)!6*!!)!!N!F'#!%c3!$!!*!("!S!#3!@!!N#!!N!N!3S2rkUN!H
+V!!#!JQ-P$!)3$J!*!!!*!4)@!*!%#3%!!!!m2rr99C!'9J!!J)*Mr`"`!')!N!X
+4!!!),!"G*jLP,Q-'!!!!$J"G*jMrJ%)Z!!!!%!!F*jJ!A@PJ!!!(r!!!!#S!A5H
+B!*!*1!#3$8B!N!e8!!-!"`!$!Q1!!*!%!3!#!!%!!J*cJ!#3"B!!!9!!!!!"!*!
+4#J!!!!%!!!!Q!!%!N"d8!!!!"!!+!!-!N!8"!*!%-m!!!$1F!!%A2!!!-M4!J'(
+)!(A6&N#!B+`!k!!!!2i!!!!'!'K!J0GB!!!!!J!!!!&!J,[X!(DDJJ!!K&S!!4k
+M!(DDL3#3#3%HR#!!3)"!J,[X!*!*!4kF!(DDJJ"fQJ!!!4kF3)$--N#!bR"!J!!
+!K&S!!!1NJ!!Z4!!!S!+!!#j%!),A,#!)3)!!N!3#!!!!!J!!!!(r!!!!r`!!!!G
+!J*9X3)#Ul!#3"KPB!'M3Y!!!#J#3"`Kr!!!!"!"Smc!!%fNS!!"'D!"Sd,5!BZ`
+J!(D)!!!%)!3!#M&-!!!#!!!!!Im!!!$r!!#m2`!!:
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/pass/MicrosoftWorks_3.0.hqx b/writerperfect/qa/unit/data/calc/libmwaw/pass/MicrosoftWorks_3.0.hqx
new file mode 100644
index 000000000..0410df8b1
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/pass/MicrosoftWorks_3.0.hqx
@@ -0,0 +1,54 @@
+(This file must be converted with BinHex 4.0)
+:#R0SC@9d,RGVFc-!39G68de69dX"!!!!#UX!!!&''FJ!!!!*!$i!"!'L!Mi!!!9
+X!!-!N!B)!*!)$`!!!%J!5!#3"!,`!N$rmIrZ!`N#8Q-#"5J$r!%!!!!"D!&S!*!
+%$V!,3!!"!3!!C!!"!!!!!3!#!!!!!5F2!!%!N!i3!*!*%!$rYIqQ$bd,QJ!)!3#
+3$4N"!(J!H!"i!(J!N!F"!!%!N"!)r`!'!!N!8lfi!(i!N!FL!G3!N!8*!!!*!J#
+3"`0!!*!',!!"!*!!!!)!p!!$!9J!"!'mJ!8#)!!'!X3!"`-S!!J$M)!*!r!!#J4
+8!!X%Z!!-"4b!$3@!!!i&j!!2"NJ!%!DXJ"%(%!!5"h3!%`IB!"3)2)!9#+!!&JN
+%!"F*D!!B#Fb!'3S`!"S+P!!E#[J!(!YFJ"d,`!!H$#3!(`b)!#!-l)!K$9!!)Jf
+d!#-1'!!N$Rb!*3lJ!#B24!!R$kJ!+"!-J#N3F!!U%03!+a%i!#`4R)!Y%J!!,K*
+N!#m5b!!`%bb!-413!!!b%r3!-a4B!$38[)!e&5!!0K@%!$F9k!!i&Nb!14D`!$S
+A&!!l&hJ!2"IFJ$dB3!!q'+3!2aN)!%!CE)""'G!!3KSd!%-DQ!"%'[b!44YJ!%B
+Ea!"((#J!5"b-J%NFm!"+(93!5afi!%`H()"0(S!!6KlN!%mI5!"3(kb!85!3!&)
+JG!"6)0J!9#%mJ&8KS!"@)J3!9b*S!&JLc)"C)c!!@L18!&XMq!"F*&b!A56!!&i
+P*!"I*BJ!B#AXJ'%Q8!"L*V3!BbFB!'3RI)"P*q!!CLK%!'FSU!"S+3b!D5P`!'S
+Te!"V+MJ!E#UFJ'dV!!"Z+f3!Eb[)!(!X,)"a,*!!!()Xp!"c,9J!G#fmJ(8Z)!"
+f,S3!GblS!(J[6)"j,l!!HM!8!(X`H!"m-0b!I6&!!(iaT!"r-JJ!J$*XJ)%bd!#
+#-c3!Jc1B!)3cr)#&0'!!KM6%!)Fe+!#)0Bb!L6A`!)Sf9!#,0VJ!M$FFJ)dhJ!#
+10q3!McK)!*!!1+b!N6N3!*)jG!#61GJ!P$SmJ*8kS!#@1`3!PcYS!*Jlc)#C2$!
+!QMb8!*Xmq!#F29b!R6h!!*iq*!#I2SJ!S$lXJ+%r8!#L2l3!Sd!B!+4!I)#P31!
+!TN&%!+G"U!#S3Jb!U8*`!+T#e!#V3cJ!V%1FJ+e%!!#Z4'3!Vd6)!,"&,)#a4C!
+!!,*&p!#c4PJ!Y%DmJ,9()!#f4i3!YdIS!,K)6)#j5,!!ZNN8!,Y*H!#m5Gb![8T
+!!,j+T!#r5`J!`%YXJ-&,d!$#6$3!`dbB!-4-r)$&6@!!aNh%!-G1+!$)6Sb!b8l
+`!-T29!$,6lJ!c&!FJ-e3J!$1813!ce&)!0"4V)$48K!!dP*d!005f!$88cb!e91
+J!0C8"!$A9'J!f&6-J0P9-!$D9C3!feAi!0a@A)$G9X!!hPFN!0pAL!$J9qb!i9K
+3!1*BY!$M@4J!j&PmJ19Ci!$Q@N3!jeUS!1KE$)$T@h!!kP[8!1YF1!$XA*b!l9d
+!!1jGC!$[AFJ!m&iXJ2&HN!!!mPld!20I@!$dAlb!p@!J!2CJK!$hB1J!q'&-J2P
+KX!$kBK3!qf*i!2aLh)$pBd!!rQ1N!2pN#!%!C'b"!@83!3)!N2m!N!F2L!!X!!!
+!!3!"!!%!!6rq!3!!!`!-!!!!r`#3'63,EQpbE@&Xr`!!!X!*BQpXC2m!!!,J$R9
+ZC'9bE'PZCIm!!!,3#fPdB@aTBrm!!!,)rJ(r!!!!B!KbC@5H!!!#`!TRFQ9PEMX
+!!!,!#@*XG@9N!!!#`%!S)'C[ER3JB@jN)'C[ER3JFfPkC5"KFQ8JC'9QD@jPC#"
+QEh)JBfpYF'aPG'8JFh"bC@&NFfKPCA3J+Im!!",!r`!!!#d+B@aTCflr!!!#`!P
+XC@Cdr`!!!J!,Bf9ZG'9br`!!!N!+FQPRD(6r!!!#J2m!!!!G'h0[E@8JER9YBQ9
+bD@jR)'C[FQeKG(2r!!!#`2m!!!"c%M!Z-Mrmc*!)r`!!3X!5-#ib2rc-N!Mr!""
+#`")`,M)rr-b3#2m!)%,!%M!Z-Mrmc*!)r`"J3X!5-#ib2rc-N!Mr!&"#`")`,M)
+rr-b3#2m!%%V!r`!!!#-KFfpYC5"NBA4P)'&ZC#"dD@eP*h-JCQpbE@&dFrm!!!,
+!r`!!!'BB-6)[-bmb-$!d3#d!!!!"(r`!!2m!3&,!'$%b,c-[-M!`0%!Y!!!!!4r
+m!!$r!*!!8X!A-5mc,c%j-$4!,3#3"33!!2m!d&,!'M%b1M!i1M!`)%&03#d!N!B
+#f2m!%&,!r`!!!"-4FfpYC5"QEh*YG@aKr`!!!X$r!!!!LLF)!6%rri!!N!F@!!N
+"!!$r!!!!&$rrJ!#3"rm!!-,!1JJ"-N!!J!#3"`B)!60!!-!!N!F%#J!*!"B!#3)
+!#3#3"#JrrUU3"k[r!!$#`#8-!K!1!!N!!!N"%KB!N!3*!3!!!$`rrp99N!C@r`!
+!`X$r!(!!BJ#3#a%!!!JX!&dRQ+8ZB`B!!!!1!&dRQ2q!3Li!!!!3!"`RQ!"GD@!
+!!!Im!!!!+J"G*jJ!N!Ni!*!04J#3$93!!`!(!!-#Bi!!N!3"!!)!!3!#!Z!!r`#
+3"J&N!!!!"3#3%3`!!!$r!!!2S`!9!'32S`#3"3%!!3!*!*!F"'8!!!"5!"3!!!!
+%!!S!!`#3"3%!!2rrrr`!D2Qh!'MkdJ"A3)$ZV!!!K&S!D+Ni!'LrT!#3"@LaJ!"
+SqY)J%!"Q!'Cr0#mS)'C[ER3JB@jN)(0dH@aP)'&bC5"QEh)JBfpYF'aPG'8JFh"
+bC@&NFfKP3)$ZV!!!K&S!9V2F!$eZA!#3"@J!!`"SkjiJ!!"Q!'EK$!!!#UX!!!C
+drrm!!!"Sq3%!D9CU!&22c%#!jHS!!+!P3)$LD!!!!!)!!!UV!!!'G2rrrr`!N!9
+4,X`!9alS!&2"Q!"Trrrrr%#!lUa!J1kX!!#%@J"SULB!2AGr!!!!!3#3"@MVRL!
+!!'B!CZ%-!!!!r`!!!2m!!!!(!!"%Q`!!!3!!!!%8!!!!&!!!!$)!N!8H!$F!*`#
+1!AJ!!3%!N!L1#80XEh0P#R0SC@9d,RGVFc-!!J#30Fqb-`8!N!B"4T3"9!(S!!8
+!N!JE@K9"E'`J9fpbDh-J8(*PCQ9bC@jMCA-!!!![!#d!+!&!!A`!"3#3#"YE'PG
+[FQ3J8(*[Bf9cFfpb)&"bC@CPFQ9ZBf9c!!!!*3!Y!(B"3!(+!!8!N!JEA""%FQ&
+h)&"bC@CPFQ9ZBf8!!!!3$deTBh*[FfpQG#"AEh*VF`!!!3!!!!%8!!!!&!!!!$)
+!8mG3'9J!!!!F!$)!!&088L!!!!!+[r6rr`#3"91p%)L6:
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/pass/MicrosoftWorks_4.0.wk4 b/writerperfect/qa/unit/data/calc/libmwaw/pass/MicrosoftWorks_4.0.wk4
new file mode 100644
index 000000000..5adbc7b7d
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/pass/MicrosoftWorks_4.0.wk4
Binary files differ
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/pass/MicrosoftWorks_DB_2.0.hqx b/writerperfect/qa/unit/data/calc/libmwaw/pass/MicrosoftWorks_DB_2.0.hqx
new file mode 100644
index 000000000..d912b1f3c
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/pass/MicrosoftWorks_DB_2.0.hqx
@@ -0,0 +1,20 @@
+(This file must be converted with BinHex 4.0)
+:#@4KG'%ZGf4L-J""9d4#8&0*-J#3"!Dc!*!%4H!!!!!)!$d!&!(6!Ni!!!@-!!)
+!N!F"!*!(!`!(!!!!!J$)!*!&#!!"!'J!!J$-!!-"-!!#!-J!!`(S!!B#5!!(!UJ
+!#!-)!!N$D!!+!mJ!#`3S!!`%L!!0"1J!$J9)!!m&U!!3"JJ!%3CS!")'b!!6"bJ
+!&!H)!"8(k!!@#%J!&`LS!"J*#!!C#@J!'JR)!"X++!!F#SJ!(3VS!"i,5!!I#kJ
+!)!`)!#%-D!!L$-J!)`dS!#30L!!P$HJ!*Jj)!#F1U!!S$`J!+3pS!#S2b!!V%#J
+!,"#)!#d3k!!Z%8J!,a'S!$!5#!!a%QJ!-K,)!$-6+!!d%iJ!042S!$B85!!h&+J
+!1"8)!$N9D!!k&FJ!1aBS!$`@L!!prrm!2J#3#33!"!"X)J!!"!!8!'`Z!!!%!#3
+!E"i!N2m!N-i#!!#!3N!!J%)&!)!#B`#!!Q-!J!*M!)!#B`#!!Q-!J!*M!)!#B`#
+!!Q-!J!*M!)!#B`#!!Q-!J!*M!)!#B`#!!Q-!J!*M!)!#B`#!!Q-!J!*M!)!#B`#
+!!Q-!J!*M!)!#B`#!!Q-!J!*M!)!#B`#!!Q-!J!*M!)!#B`#!!Q-!J!*M!)!#B`#
+!!Q-!J!*M!)!#B`#!!Q-!J!*M!)!#B`#!!Q-!J!*M!)!#B`#!!Q-!J!*M!)!#B`#
+!!Q-!J!*M!)!#B`#!!Q-!J!*M!)!#B`#!!Q-!J!*M!)!#B`#!!Q-!J!*M!)!#B`#
+!!Q-!J!*M!)!!N!N)!!!!!3!"!*$a!`!*!!!!)3!$!!N!!!!K!!)!$J#3G`(r!")
+%EQ&YC3CZG@eLCA)%C'&dCIm!(!4dEh4[#N!!`!#3"`S!N!Vr!"`%G(9dG3T!!B!
+!N!F+3#d!N!8m!!$r!"`%G'PdD3T!!D!!N!F+3#d!N!6e+J!!r`!R*5JJBfpZG'&
+TER-J-b"QD@9XC(-JEQ&YC5pZG@eLCA)[C'&dC5Rr!$`k+#"TEL"QD@9XC#!a1L"
+dEh4[,(4eG(8XG'PdD5!V)(4SCA0P)'C[GA)JBfpYE@9ZG#Gc)'aTEQ9c+Im!)b%
+SD@iJCQPPE'3J-MSJ-b`d,$8JGfPdD#!b)'4TCfPdFbRr!#JQ+'PZ)'CTC@aN)$-
+k)$%[-5m`0#`J-5mc-5m`0#`J-6)[-5mi15RrYQF!!!:
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/pass/MicrosoftWorks_DB_3.0.hqx b/writerperfect/qa/unit/data/calc/libmwaw/pass/MicrosoftWorks_DB_3.0.hqx
new file mode 100644
index 000000000..8f7738658
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/pass/MicrosoftWorks_DB_3.0.hqx
@@ -0,0 +1,266 @@
+(This file must be converted with BinHex 4.0)
+:#Q4KG'&1,RGNBM-!39G%3Ne69dX!N!3dr!!!!8CK@`!!!!N!23!%!GF#2J!!!&!
+!!J#3$`-!"`!"!*!&"J!"!!%!N%-6"'jKE@8'ER9YBQ9b"'4KG'Ar!*!%(34dEh4
+[#N!!`!#3"`S!N!Vr!*!%(34dGA4e#N!"J!#3"`T!,3!!!!%GPJ!!r`#3""d%G'P
+dD3T!!D!!N!F+3#d!N!6e+J!!r`#3"#JP+#"MEfjdB@PZFb!c)'CTC@aNFb"ZB@e
+P,fjeE@*PFLpNBA4P+Im!N!3p1LJJD@iJCQPPE'3J-6SJG'pdEbadGA4e,(4TG'N
+J+b"dD'9cC5"QEh9b)'0[E@ePER3RFb"XD@jPFbRr!*!%*#%SD@iJCQPPE'3J-MS
+J-b`d,$8JGfPdD#!b)'4TCfPdFbRr!*!%+5BSD@iJCQPPE'3J-cSJ-5ma,c!d,#!
+a,c-a,c!d,#!a-Lma,cJj+Im!!!!0mJ!)!!-!#3)!!2m!%J!!!!J!!`!*!P-!r`!
+54!!M#3!$!!N#8`$r!"*%!%!*!!-!#3*6!2m!%N3!!!J!!`!*!P-!r`!54!!!#!!
+$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$
+r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!
+)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)
+!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!
+!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!
+*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!
+5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!
+$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$
+r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!
+)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)
+!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!
+!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!
+*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!
+5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!
+$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$
+r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!
+)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)
+!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!
+!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!
+*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!
+5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!
+$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$
+r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!
+)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)
+!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!
+!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!
+*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!
+5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!
+$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$
+r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!
+)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)
+!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!
+!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!
+*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!
+5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!
+$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$
+r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!
+)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)
+!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!
+!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!
+*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!
+5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!
+$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$
+r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!
+)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)
+!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!
+!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!
+*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!
+5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!
+$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$
+r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!
+)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)
+!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!
+!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!
+*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!
+5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!
+$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$
+r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!
+)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)
+!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!
+!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!
+*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!
+5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!
+$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$
+r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!
+)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)
+!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!
+!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!
+*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!
+5!!!!#!!$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!
+$!!N#!!$r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$
+r!")!!!!)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!!!!
+)!!-!#3)!!2m!%J!!!!J!!`!*!J!!r`!5!!!!#!!$!!N#!!$r!")!N!3#!J#3r`#
+3r`#3"`,r!*!%![m!N!3)!*!0#!!"!'J!!J$)!!-"+!!"!'J!!J(S!!B#5!!(!UJ
+!#!-)!!N$D!!+!mJ!#`3S!!`%L!!0"1J!$J9)!!m&U!!3"JJ!%3CS!")'b!!6"bJ
+!&!H)!"8(k!!@#%J!&`LS!"J*#!!C#@J!'JR)!"X++!!F#SJ!(3VS!"i,5!!I#kJ
+!)!`)!#%-D!!L$-J!)`dS!#30L!!P$HJ!*Jj)!#F1U!!S$`J!+3pS!#S2b!!V%#J
+!,"#)!#d3k!!Z%8J!,a'S!$!5#!!a%QJ!-K,)!$-6+!!d%iJ!042S!$B85!!h&+J
+!1"8)!$N9D!!k&FJ!1aBS!$`@L!!p&ZJ!2KG)!$mAU!"!'!J!34KS!%)Bb!"$'5J
+!4"Q)!%8Ck!"''NJ!4aUS!%JE#!"*'fJ!5K[)!%XF+!"-()J!64cS!%iG5!"2(DJ
+!8"i)!&%HD!"5(XJ!8amS!&3IL!"9(qJ!9L")!&FJU!"B)3J!@5&S!&SKb!"E)LJ
+!A#+)!&dLk!"H)dJ!Ab1S!'!N#!"K*'J!BL6)!'-P+!"N*BJ!C5AS!'BQ5!"R*UJ
+!D#F)!'NRD!"U*mJ!DbJS!'`SL!"Y+1J!ELP)!'mTU!"`+JJ!F5TS!()Ub!"c+bJ
+!G#Z)!(8Vk!"f,%J!GbbS!(JY#!"j,@J!HLh)!(XZ+!"m,SJ!I5lS!(i[5!"r,kJ
+!J$!)!)%`D!##--J!Jc%S!)3aL!#&-HJ!KM*)!)FbU!#)-`J!L60S!)Scb!#,0#J
+!M$5)!)ddk!#108J!Mc@S!*!!0JJ!N6CS!*)fb!#60bJ!P$H)!*8hk!#@1%J!PcL
+S!*Jj#!#C1@J!QMR)!*Xk+!#F1SJ!R6VS!*il5!#I1kJ!S$`)!+%mD!#L2-J!Scd
+S!+3pL!#P2HJ!TMj)!+FqU!#S2`J!U6pS!+Srb!#V3#J!V%#)!+e!k!#Z38J!Vd'
+S!,"##!#a3QJ!XN,)!,0$+!#d3iJ!Y82S!,C%5!#h4+J!Z%8)!,P&D!#k4FJ!ZdB
+S!,a'L!#p4ZJ![NG)!,p(U!$!5!J!`8KS!-*)b!$$55J!a%Q)!-9*k!$'5NJ!adU
+S!-K,#!$*5fJ!bN[)!-Y-+!$-6)J!c8cS!-j05!$26DJ!d%i)!0&1D!$56XJ!ddm
+S!042L!$96qJ!eP")!0G3U!$B83J!f9&S!0T4b!$E8LJ!h&+)!0e5k!$H8dJ!he1
+S!1"8#!$K9'J!iP6)!109+!$N9BJ!j9AS!1C@5!$R9UJ!k&F)!1PAD!$U9mJ!keJ
+S!1aBL!$Y@1J!lPP)!1pCU!$`@JJ!m9TS!2*Db!$c@bJ!p&Z)!29Ek!$fA%J!peb
+S!2KG#!$jA@J!qPh)!2YH+!$mASJ!r9lS!2jI5!$rAkJ"!'!)!!$rr`!!39G%3J#
+3"3J!!!!"!!%!!`!*!!!!r`%!kji!8mr-!'N!"!!"%i!!D!!!($!29@jdDA4XC@3
+J4QpbE5!a!*!48m'J!&2$1!"6`DJ!8m'B!!F!"`,h!NF!N!F"!*!SF!!!!`!*r`#
+3"!X!@J!G!1F!#`!,!"d!@`!!F!!!!`!*r`#3"#%!@J!c!1F!)3!,!$-!@`!!F!!
+!!`!*r`#3"$F!@J"*!1F!0`!,!%N!@`!!3!!!!`!*r`#3"%d!@J"I!1F!63!,!&m
+!@`!!3!!!!`!*r`#3"'-!@J"e!1F!B`!,!(8!@`!!3!!!!`!*r`#3"(N!@J#,!1F
+!H3!,!)X!@`!!3!!!!`!*r`#3")m!@J#K!1F!M`!,!+%!@`!!3!!!!`!*r`#3"+8
+!@J#h!1F!T3!,!,F!@`!!3!!!!`!*r`#3",X!@J$0!1F!Z`!,!-d!@`!!3!!!!`!
+*r`#3"0%!@J$M!1F!d3!,!1-!@`!!3!!!!`!*r`#3"1F!@J$j!1F!j`!,!2N!@`!
+!3!!!!`!*r`#3"2d!@J%2!1F!r3!,!3m!@`!!3!!!!`!*r`!!!!%6!&S"*3$R!4-
+!#`%P!&X!!%!!!!-!#Im!!!!"+3"D!6X!j`%T!!X"1`"E!!"!!!!$!!Rr!!!!!6m
+!@J&4!1F"2`!,!9%!@`!!3!!!!`!*r`!!!!&9!&S"C`$R!98!#`&R!&X!!%!!!!-
+!#Im!!!!"D`"D!Ad!j`&V!!X"I3"E!!"!!!!$!!Rr!!!!!B%!@J'6!1F"J3!,!C-
+!@`!!3!!!!`!*r`!!!!'A!&S"U3$R!CF!#`'T!&X!!%!!!!-!#Im!!!!"V3"D!Em
+!j`'Y!!X"[`"E!!"!!!!$!!Rr!!!!!F-!@J(9!1F"``!,!G8!@`!!3!!!!`!*r`!
+!!!(C!&S"k`$R!GN!#`(V!&X!!%!!!!-!#Im!!!!"l`"D!J%!j`([!!X#!3"E!!"
+!!!!$!!Rr!!!!!J8!@J)A!1F#"3!,!KF!@`!!3!!!!`!*r`!!!!)E!&S#,3$R!KX
+!#`)Y!&X!!%!!!!-!#Im!!!!#-3"D!N-!j`)a!!X#3`"E!!"!!!!$!!Rr!!!!!NF
+!@J*C!1F#4`!,!PN!@`!!3!!!!`!*r`!!!!*G!&S#E`$R!Pd!#`*[!&X!!%!!!!-
+!#Im!!!!#F`"D!S8!j`*c!!X#K3"E!!"!!!!$!!Rr!!!!!SN!@J+E!1F#L3!,!TX
+!@`!!3!!!!`!*r`!!!!+I!&S#X3$R!Tm!#`+a!&X!!%!!!!-!#Im!!!!#Y3"D!XF
+!j`+e!!X#a`"E!!"!!!!$!!Rr!!!!!XX!@J,G!1F#b`!,!Yd!@`!!3!!!!`!*r`!
+!!!,K!&S#m`$R!Z%!#`,c!&X!!%!!!!-!#Im!N!3,!6S!(3((!!X!k`!G!6X!!%!
+!!!-!#Im!N!3K!6S!-`((!#%!k`!c!6X!!%!!!!-!#Im!N!3h!6S!53((!$F!k`"
+*!6X!!%!!!!-!#Im!N!40!6S!A`((!%d!k`"I!6X!!%!!!!-!#Im!N!4M!6S!G3(
+(!'-!k`"e!6X!!%!!!!-!#Im!N!4j!6S!L`((!(N!k`#,!6X!!%!!!!-!#Im!N!5
+2!6S!S3((!)m!k`#K!6X!!%!!!!-!#Im!N!5P!6S!Y`((!+8!k`#h!6X!!%!!!!-
+!#Im!N!5l!6S!c3((!,X!k`$0!6X!!%!!!!-!#Im!N!64!6S!i`((!0%!k`$M!6X
+!!%!!!!-!#Im!N!6R!6S!q3((!1F!k`$j!6X!!%!!!!-!#Im!N!6p!6S"$`((!2d
+!k`%2!6X!!%!!!!-!#Im!!!!"%`%k!58"a`%6!1X"*3%l!!"!!!!$!!Rr!!!!!5N
+"1J%l!FF"+3$V!6X"1`!!3!!!!`!*r`!!!!%r!6S"83((!6m!k`&4!6X!!%!!!!-
+!#Im!!!!"93%k!@F"a`&9!1X"C`%l!!"!!!!$!!Rr!!!!!@X"1J&p!FF"D`$V!Ad
+"1`!!3!!!!`!*r`!!!!'"!6S"N`((!B%!k`'6!6X!!%!!!!-!#Im!!!!"P`%k!DN
+"a`'A!1X"U3%l!!"!!!!$!!Rr!!!!!Dd"1J'r!FF"V3$V!Em"1`!!3!!!!`!*r`!
+!!!($!6S"e3((!F-!k`(9!6X!!%!!!!-!#Im!!!!"f3%k!HX"a`(C!1X"k`%l!!"
+!!!!$!!Rr!!!!!Hm"1J)"!FF"l`$V!J%"1`!!3!!!!`!*r`!!!!)&!6S#&`((!J8
+!k`)A!6X!!%!!!!-!#Im!!!!#'`%k!Ld"a`)E!1X#,3%l!!"!!!!$!!Rr!!!!!M%
+"1J*$!FF#-3$V!N-"1`!!3!!!!`!*r`!!!!*(!6S#@3((!NF!k`*C!6X!!%!!!!-
+!#Im!!!!#A3%k!Qm"a`*G!1X#E`%l!!"!!!!$!!Rr!!!!!R-"1J+&!FF#F`$V!S8
+"1`!!3!!!!`!*r`!!!!+*!6S#Q`((!SN!k`+E!6X!!%!!!!-!#Im!!!!#R`%k!V%
+"a`+I!1X#X3%l!!"!!!!$!!Rr!!!!!V8"1J,(!FF#Y3$V!XF"1`!!3!!!!`!*r`!
+!!!,,!6S#h3((!XX!k`,G!6X!!%!!!!-!#Im!!!!#i3%k![-"a`,K!1X#m`%l!!"
+!!!!$!!Rr!*!%#`)D!"d#T`!,!FX!(3)E!!"!!!!$!!Rr!*!%)3)D!$-#T`!K!FX
+!-`)E!!"!!!!$!!Rr!*!%0`)D!%N#T`!h!FX!53)E!!"!!!!$!!Rr!*!%63)D!&m
+#T`"0!FX!A`)E!!"!!!!$!!Rr!*!%B`)D!(8#T`"M!FX!G3)E!!"!!!!$!!Rr!*!
+%H3)D!)X#T`"j!FX!L`)E!!"!!!!$!!Rr!*!%M`)D!+%#T`#2!FX!S3)E!!"!!!!
+$!!Rr!*!%T3)D!,F#T`#P!FX!Y`)E!!"!!!!$!!Rr!*!%Z`)D!-d#T`#l!FX!c3)
+E!!"!!!!$!!Rr!*!%d3)D!1-#T`$4!FX!i`)E!!"!!!!$!!Rr!*!%j`)D!2N#T`$
+R!FX!q3)E!!"!!!!$!!Rr!*!%r3)D!3m#T`$p!FX"$`)E!!"!!!!$!!Rr!!!!!4-
+#'J%P!UF"%`(,!58#'`!!3!!!!`!*r`!!!!%T!KS"1`+R!5N"b`%l!KX!!%!!!!-
+!#Im!!!!"2`)D!9%#T`%r!FX"83)E!!"!!!!$!!Rr!!!!!98#'J&R!UF"93(,!@F
+#'`!!3!!!!`!*r`!!!!&V!KS"I3+R!@X"b`&p!KX!!%!!!!-!#Im!!!!"J3)D!C-
+#T`'"!FX"N`)E!!"!!!!$!!Rr!!!!!CF#'J'T!UF"P`(,!DN#'`!!3!!!!`!*r`!
+!!!'Y!KS"[`+R!Dd"b`'r!KX!!%!!!!-!#Im!!!!"``)D!G8#T`($!FX"e3)E!!"
+!!!!$!!Rr!!!!!GN#'J(V!UF"f3(,!HX#'`!!3!!!!`!*r`!!!!([!KS#!3+R!Hm
+"b`)"!KX!!%!!!!-!#Im!!!!#"3)D!KF#T`)&!FX#&`)E!!"!!!!$!!Rr!!!!!KX
+#'J)Y!UF#'`(,!Ld#'`!!3!!!!`!*r`!!!!)a!KS#3`+R!M%"b`*$!KX!!%!!!!-
+!#Im!!!!#4`)D!PN#T`*(!FX#@3)E!!"!!!!$!!Rr!!!!!Pd#'J*[!UF#A3(,!Qm
+#'`!!3!!!!`!*r`!!!!*c!KS#K3+R!R-"b`+&!KX!!%!!!!-!#Im!!!!#L3)D!TX
+#T`+*!FX#Q`)E!!"!!!!$!!Rr!!!!!Tm#'J+a!UF#R`(,!V%#'`!!3!!!!`!*r`!
+!!!+e!KS#a`+R!V8"b`,(!KX!!%!!!!-!#Im!!!!#b`)D!Yd#T`,,!FX#h3)E!!"
+!!!!$!!Rr!!!!!Z%#'J,c!UF#i3(,![-#'`!!3!!!!`!*r`#3"!d!A!!I!1N!$3!
+0!"m!A3!!3!!!!`!*r`#3"#-!A!!e!1N!)`!0!$8!A3!!3!!!!`!*r`#3"$N!A!"
+,!1N!13!0!%X!A3!!3!!!!`!*r`#3"%m!A!"K!1N!6`!0!'%!A3!!3!!!!`!*r`#
+3"'8!A!"h!1N!C3!0!(F!A3!!3!!!!`!*r`#3"(X!A!#0!1N!H`!0!)d!A3!!3!!
+!!`!*r`#3"*%!A!#M!1N!N3!0!+-!A3!!3!!!!`!*r`#3"+F!A!#j!1N!T`!0!,N
+!A3!!3!!!!`!*r`#3",d!A!$2!1N![3!0!-m!A3!!3!!!!`!*r`#3"0-!A!$P!1N
+!d`!0!18!A3!!3!!!!`!*r`#3"1N!A!$l!1N!k3!0!2X!A3!!3!!!!`!*r`#3"2m
+!A!%4!1N!r`!0!4%!A3!!3!!!!`!*r`!!!!%9!&`"*`$T!48!$3%R!&d!!%!!!!-
+!#Im!!!!"+`"F!6d!k3%V!!d"23"G!!"!!!!$!!Rr!!!!!8%!A!&6!1N"33!0!9-
+!A3!!3!!!!`!*r`!!!!&A!&`"D3$T!9F!$3&T!&d!!%!!!!-!#Im!!!!"E3"F!Am
+!k3&Y!!d"I`"G!!"!!!!$!!Rr!!!!!B-!A!'9!1N"J`!0!C8!A3!!3!!!!`!*r`!
+!!!'C!&`"U`$T!CN!$3'V!&d!!%!!!!-!#Im!!!!"V`"F!F%!k3'[!!d"`3"G!!"
+!!!!$!!Rr!!!!!F8!A!(A!1N"a3!0!GF!A3!!3!!!!`!*r`!!!!(E!&`"l3$T!GX
+!$3(Y!&d!!%!!!!-!#Im!!!!"m3"F!J-!k3(a!!d#!`"G!!"!!!!$!!Rr!!!!!JF
+!A!)C!1N#"`!0!KN!A3!!3!!!!`!*r`!!!!)G!&`#,`$T!Kd!$3)[!&d!!%!!!!-
+!#Im!!!!#-`"F!N8!k3)c!!d#43"G!!"!!!!$!!Rr!!!!!NN!A!*E!1N#53!0!PX
+!A3!!3!!!!`!*r`!!!!*I!&`#F3$T!Pm!$3*a!&d!!%!!!!-!#Im!!!!#G3"F!SF
+!k3*e!!d#K`"G!!"!!!!$!!Rr!!!!!SX!A!+G!1N#L`!0!Td!A3!!3!!!!`!*r`!
+!!!+K!&`#X`$T!U%!$3+c!&d!!%!!!!-!#Im!!!!#Y`"F!XN!k3+h!!d#b3"G!!"
+!!!!$!!Rr!!!!!Xd!A!,I!1N#c3!0!Ym!A3!!3!!!!`!*r`!!!!,M!&`#p3$T!Z-
+!$3,e!&d!!%!!!!-!#Im!N!30!6`!(`(*!!d!l3!I!6d!!%!!!!-!#Im!N!3M!6`
+!03(*!#-!l3!e!6d!!%!!!!-!#Im!N!3j!6`!5`(*!$N!l3",!6d!!%!!!!-!#Im
+!N!42!6`!B3(*!%m!l3"K!6d!!%!!!!-!#Im!N!4P!6`!G`(*!'8!l3"h!6d!!%!
+!!!-!#Im!N!4l!6`!M3(*!(X!l3#0!6d!!%!!!!-!#Im!N!54!6`!S`(*!*%!l3#
+M!6d!!%!!!!-!#Im!N!5R!6`!Z3(*!+F!l3#j!6d!!%!!!!-!#Im!N!5p!6`!c`(
+*!,d!l3$2!6d!!%!!!!-!#Im!N!66!6`!j3(*!0-!l3$P!6d!!%!!!!-!#Im!N!6
+T!6`!q`(*!1N!l3$l!6d!!%!!!!-!#Im!N!6r!6`"%3(*!2m!l3%4!6d!!%!!!!-
+!#Im!!!!"&3%m!5F"b3%9!1d"*`%p!!"!!!!$!!Rr!!!!!5X"2!%p!FN"+`$Y!6d
+"23!!3!!!!`!*r`!!!!&"!6`"8`(*!8%!l3&6!6d!!%!!!!-!#Im!!!!"9`%m!@N
+"b3&A!1d"D3%p!!"!!!!$!!Rr!!!!!@d"2!&r!FN"E3$Y!Am"23!!3!!!!`!*r`!
+!!!'$!6`"P3(*!B-!l3'9!6d!!%!!!!-!#Im!!!!"Q3%m!DX"b3'C!1d"U`%p!!"
+!!!!$!!Rr!!!!!Dm"2!("!FN"V`$Y!F%"23!!3!!!!`!*r`!!!!(&!6`"e`(*!F8
+!l3(A!6d!!%!!!!-!#Im!!!!"f`%m!Hd"b3(E!1d"l3%p!!"!!!!$!!Rr!!!!!I%
+"2!)$!FN"m3$Y!J-"23!!3!!!!`!*r`!!!!)(!6`#'3(*!JF!l3)C!6d!!%!!!!-
+!#Im!!!!#(3%m!Lm"b3)G!1d#,`%p!!"!!!!$!!Rr!!!!!M-"2!*&!FN#-`$Y!N8
+"23!!3!!!!`!*r`!!!!**!6`#@`(*!NN!l3*E!6d!!%!!!!-!#Im!!!!#A`%m!R%
+"b3*I!1d#F3%p!!"!!!!$!!Rr!!!!!R8"2!+(!FN#G3$Y!SF"23!!3!!!!`!*r`!
+!!!+,!6`#R3(*!SX!l3+G!6d!!%!!!!-!#Im!!!!#S3%m!V-"b3+K!1d#X`%p!!"
+!!!!$!!Rr!!!!!VF"2!,*!FN#Y`$Y!XN"23!!3!!!!`!*r`!!!!,0!6`#h`(*!Xd
+!l3,I!6d!!%!!!!-!#Im!!!!#i`%m![8"b3,M!1d#p3%p!!"!!!!$!!Rr!*!%$3)
+F!"m#U3!0!Fd!(`)G!!"!!!!$!!Rr!*!%)`)F!$8#U3!M!Fd!03)G!!"!!!!$!!R
+r!*!%13)F!%X#U3!j!Fd!5`)G!!"!!!!$!!Rr!*!%6`)F!'%#U3"2!Fd!B3)G!!"
+!!!!$!!Rr!*!%C3)F!(F#U3"P!Fd!G`)G!!"!!!!$!!Rr!*!%H`)F!)d#U3"l!Fd
+!M3)G!!"!!!!$!!Rr!*!%N3)F!+-#U3#4!Fd!S`)G!!"!!!!$!!Rr!*!%T`)F!,N
+#U3#R!Fd!Z3)G!!"!!!!$!!Rr!*!%[3)F!-m#U3#p!Fd!c`)G!!"!!!!$!!Rr!*!
+%d`)F!18#U3$6!Fd!j3)G!!"!!!!$!!Rr!*!%k3)F!2X#U3$T!Fd!q`)G!!"!!!!
+$!!Rr!*!%r`)F!4%#U3$r!Fd"%3)G!!"!!!!$!!Rr!!!!!48#(!%R!UN"&3(0!5F
+#(3!!3!!!!`!*r`!!!!%V!K`"23+T!5X"c3%p!Kd!!%!!!!-!#Im!!!!"33)F!9-
+#U3&"!Fd"8`)G!!"!!!!$!!Rr!!!!!9F#(!&T!UN"9`(0!@N#(3!!3!!!!`!*r`!
+!!!&Y!K`"I`+T!@d"c3&r!Kd!!%!!!!-!#Im!!!!"J`)F!C8#U3'$!Fd"P3)G!!"
+!!!!$!!Rr!!!!!CN#(!'V!UN"Q3(0!DX#(3!!3!!!!`!*r`!!!!'[!K`"`3+T!Dm
+"c3("!Kd!!%!!!!-!#Im!!!!"a3)F!GF#U3(&!Fd"e`)G!!"!!!!$!!Rr!!!!!GX
+#(!(Y!UN"f`(0!Hd#(3!!3!!!!`!*r`!!!!(a!K`#!`+T!I%"c3)$!Kd!!%!!!!-
+!#Im!!!!#"`)F!KN#U3)(!Fd#'3)G!!"!!!!$!!Rr!!!!!Kd#(!)[!UN#(3(0!Lm
+#(3!!3!!!!`!*r`!!!!)c!K`#43+T!M-"c3*&!Kd!!%!!!!-!#Im!!!!#53)F!PX
+#U3**!Fd#@`)G!!"!!!!$!!Rr!!!!!Pm#(!*a!UN#A`(0!R%#(3!!3!!!!`!*r`!
+!!!*e!K`#K`+T!R8"c3+(!Kd!!%!!!!-!#Im!!!!#L`)F!Td#U3+,!Fd#R3)G!!"
+!!!!$!!Rr!!!!!U%#(!+c!UN#S3(0!V-#(3!!3!!!!`!*r`!!!!+h!K`#b3+T!VF
+"c3,*!Kd!!%!!!!-!#Im!!!!#c3)F!Ym#U3,0!Fd#h`)G!!"!!!!$!!Rr!!!!!Z-
+#(!,e!UN#i`(0![8#(3!!3!!!!`!*r`#3"!m!AJ!K!1X!$`!2!#%!A`!!3!!!!`!
+*r`#3"#8!AJ!h!1X!*3!2!$F!A`!!3!!!!`!*r`#3"$X!AJ"0!1X!1`!2!%d!A`!
+!3!!!!`!*r`#3"&%!AJ"M!1X!83!2!'-!A`!!3!!!!`!*r`#3"'F!AJ"j!1X!C`!
+2!(N!A`!!3!!!!`!*r`#3"(d!AJ#2!1X!I3!2!)m!A`!!3!!!!`!*r`#3"*-!AJ#
+P!1X!N`!2!+8!A`!!3!!!!`!*r`#3"+N!AJ#l!1X!U3!2!,X!A`!!3!!!!`!*r`#
+3",m!AJ$4!1X![`!2!0%!A`!!3!!!!`!*r`#3"08!AJ$R!1X!e3!2!1F!A`!!3!!
+!!`!*r`#3"1X!AJ$p!1X!k`!2!2d!A`!!3!!!!`!*r`!!!!%"!&i"%`$V!3%!$`%
+6!&m!!%!!!!-!#Im!!!!"&`"H!5N!k`%A!!m"+3"I!!"!!!!$!!Rr!!!!!5d!AJ%
+r!1X",3!2!6m!A`!!3!!!!`!*r`!!!!&$!&i"93$V!8-!$`&9!&m!!%!!!!-!#Im
+!!!!"@3"H!@X!k`&C!!m"D`"I!!"!!!!$!!Rr!!!!!@m!AJ'"!1X"E`!2!B%!A`!
+!3!!!!`!*r`!!!!'&!&i"P`$V!B8!$`'A!&m!!%!!!!-!#Im!!!!"Q`"H!Dd!k`'
+E!!m"V3"I!!"!!!!$!!Rr!!!!!E%!AJ($!1X"X3!2!F-!A`!!3!!!!`!*r`!!!!(
+(!&i"f3$V!FF!$`(C!&m!!%!!!!-!#Im!!!!"h3"H!Hm!k`(G!!m"l`"I!!"!!!!
+$!!Rr!!!!!I-!AJ)&!1X"m`!2!J8!A`!!3!!!!`!*r`!!!!)*!&i#'`$V!JN!$`)
+E!&m!!%!!!!-!#Im!!!!#(`"H!M%!k`)I!!m#-3"I!!"!!!!$!!Rr!!!!!M8!AJ*
+(!1X#03!2!NF!A`!!3!!!!`!*r`!!!!*,!&i#A3$V!NX!$`*G!&m!!%!!!!-!#Im
+!!!!#B3"H!R-!k`*K!!m#F`"I!!"!!!!$!!Rr!!!!!RF!AJ+*!1X#G`!2!SN!A`!
+!3!!!!`!*r`!!!!+0!&i#R`$V!Sd!$`+I!&m!!%!!!!-!#Im!!!!#S`"H!V8!k`+
+M!!m#Y3"I!!"!!!!$!!Rr!!!!!VN!AJ,,!1X#Z3!2!XX!A`!!3!!!!`!*r`!!!!,
+2!&i#i3$V!Xm!$`,K!&m!!%!!!!-!#Im!N!32!6i!)3(,!!m!l`!K!6m!!%!!!!-
+!#Im!N!3P!6i!0`(,!#8!l`!h!6m!!%!!!!-!#Im!N!3l!6i!63(,!$X!l`"0!6m
+!!%!!!!-!#Im!N!44!6i!B`(,!&%!l`"M!6m!!%!!!!-!#Im!N!4R!6i!H3(,!'F
+!l`"j!6m!!%!!!!-!#Im!N!4p!6i!M`(,!(d!l`#2!6m!!%!!!!-!#Im!N!56!6i
+!T3(,!*-!l`#P!6m!!%!!!!-!#Im!N!5T!6i!Z`(,!+N!l`#l!6m!!%!!!!-!#Im
+!N!5r!6i!d3(,!,m!l`$4!6m!!%!!!!-!#Im!N!69!6i!j`(,!08!l`$R!6m!!%!
+!!!-!#Im!N!6V!6i!r3(,!1X!l`$p!6m!!%!!!!-!#Im!!!!"!3%q!4-"b`%"!1m
+"%`%r!!"!!!!$!!Rr!!!!!4F"2J%T!FX"&`$[!5N"2`!!3!!!!`!*r`!!!!%Y!6i
+"2`(,!5d!l`%r!6m!!%!!!!-!#Im!!!!"3`%q!98"b`&$!1m"93%r!!"!!!!$!!R
+r!!!!!9N"2J&V!FX"@3$[!@X"2`!!3!!!!`!*r`!!!!&[!6i"J3(,!@m!l`'"!6m
+!N!3"AJ!2!!!!5!")!*!%![!#32rarqi$#3*5B`)&+!2m!3!!!!&S!@J!N!31X!Y
+!!!%"!!"N!!%!!!!"!!)!!!!"*`m!!3#3$K!!N!N3!2qerkB2,3ZD!!J"!*!0'3%
+!(J!C!"i!+J#3"`%!!3#3`3-!#3!!!Q3$'!!!!#%!N"!"C!!!!!8!N"%-!!!!r`!
+!$k-!&3"N$k-!N!8"!!%!#!#3(!4R!!!!$!!8!!!!!`!-!!-!N!8"!!!!63#3%3`
+!D+P%!'LP@!!!!%-!!"Qf3)#9E%#!UZ`!N!84!!$rr`!#!!S#!*!%%!)i!"B!&J!
+8!'LTG!!6D5J!!%K8!'LP4!"6rq`!!!%!!!3J"!!+-8`!N!8&!JK!J+Nb!*!(D+2
+N!!!C@!!!3)$ZV!!!K&S!D+9X!$P(A!#3#@MVRL!!!'C!J1kX!!#%@J"STB`!18G
+J!*!*D1ZH)!!!CJ"Qi3`!!$6m!!!'QIrrrrX!N!9Skji!8mr-!'MVRJ"AMr3!D+9
+m!&H3!,i!!!DCrrrrq`!!!!%!8m(3!!$N%!!!!3!!!!%8!!!!&!!!!$*"3e4"39"
+36!%!N"F+C'&dB8iZGf4L-`!#!*!ecl+9bJ#3"J&'!*!02#8"3PGVFd*AC')$!*!
+H-58"4PG59%CA,P8"!*!H'#8"6&G848e"3e)'!*!B%!p0D@0bEh0[CR3J9fpbDh-
+!!!%!!!!"&!!!!"3!!!!b!&2(8"Qf!!!!(!!b!!"69&)J!!!!#Vrdrrm!N!96[@c
+JrJ:
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/pass/MicrosoftWorks_DB_4.0.wdb b/writerperfect/qa/unit/data/calc/libmwaw/pass/MicrosoftWorks_DB_4.0.wdb
new file mode 100644
index 000000000..8b9a6d2ec
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/pass/MicrosoftWorks_DB_4.0.wdb
Binary files differ
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/pass/Multiplan_1.hqx b/writerperfect/qa/unit/data/calc/libmwaw/pass/Multiplan_1.hqx
new file mode 100644
index 000000000..48d0fe228
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/pass/Multiplan_1.hqx
@@ -0,0 +1,46 @@
+(This file must be converted with BinHex 4.0)
+:"f9YF(4j69!!69"#6P"-38i"!!!!"j`!!!&e@fm4U`!!%qJ!N!F#!N`!'!!1!Q3
+$FJ!1h03!!`!1!*3"TM-0!!J9AKR4!eiCh@&JB&i@N!!!Cf"JB(q2A`2SHM"KB'!
+6Iem$k(Z3!!"q')m@KAiGMaD'IKGH%(Z3!!"q+Bm6HM%8DYF@IiF8Gf!@Ifq&IMb
+3!!"q3*!!!(j%MhiGF)9q'('&INq3!!"q8ipq,(+&ILGcKAjHMc&qBSm8HaCX&)8
+8IN*dKAipE"+&B0d!$K&X*LS5`@!4E#+&X,9R%@`JV(UYIa&9%40rdI)493d4Ie8
+-d*B494!493r3I@%4@"&CIKKAf"&9%(V@N!!!IVD2,4#jBK&9$4D&%983&SCK%9S
+4@a#3!!"S$@*JN!!!$9Gh'"C[K3fQ&SF9Bmm1$9Ch*"C`K3e@Gc!@FB89DXm($9G
+h+KCbK3eAG`kj'JfRb"CRB'"JMbaK%9`4A3pYN!!!B*!%MaD(CpeqQhPl%981%@`
+JKApR%@`DV(UYH@&R%@`LV(UYIUr4443494&SeASV$PB4E"D&$PJ4E"b&$PF4E"L
+&Ia&9$"&@hmm&%9E5IK)1@4&X(S9r%982%9IIc`849p*q%K&9#a&X'S9qBE(r"f$
+G!"%3E#SS%'`Z*a(!B4"X*)8394)393VIdBPK%&8)%&8*%&85N!!!D"F+B@#3!!!
+-GdBXI`ah5`pSeATY+`jh!,ie$K"X*+akVAiF$lP9$(G,%Yr36Q!U$3r4)fJ,BQ#
+3!!!0&G%9#kFpV6d,Ik9q#&Gh@Ri09hG82Ddp0!Pjf@!U$3r4#QJ+BQ#3!!!d#AR
+bD"--GdYJN!!!$(G,&)82&G%#$l89hAPZB0d!!!MFe`!"!!J!"K8KL0d!&3"D!!)
+!!"PN!!+NcJ$,!!S%8M&$-31,AJ!$Lei!!)YH!!1-TJ!#T0B!!iYH!!+Pl!,m!!B
+L1J!#DiJ"![rr"!!LJJ!#Di3"!rrr"!!LbJ!#Di!""2rr"!!M%J!#Dh`""Irr"!!
+M@J!#DhJ""[rr"!!MSJ!#Dh3""rrr)!')qJ#3"!%!rrmJ!BP#!*!%!3(rrb!"LKJ
+!!!!-!"J!@3!-!"N!!U9Z!!+PC!!(!!B!$!!B!GN!$!'C!!)!!!!'!!U!"J!!!!1
+-T[rdrqF!!SRN!!)!N!F$!!+PS!!#TDJ!!J!#TDS!!U@d!!+PXJ!!!!+)h!!1!!+
+)i!!!!!%!!3#3"(rr!%F!$!(R!3S!N"i"!*"83!#!!-!"!!&!!B!"`!)!!N!#J!,
+!!`!$3!1!!m!%!!4!")!%`!8!"8!&J!A!"J!'3!D!"X!(!!G!"i!(`!J!#%!)J!M
+!#3!*3!Q!#F!+!!T!#S!+`!X!#d!,J![!$!!-3!b!$-!0!!e!$B!0`!i!$N!1J!l
+!$`!23!q!$m"rr`!!!Pd&03!!!"8!@J!#!!!CC!!#T-i!b`!+"&)a3c%$Lei!!iY
+H!!#,AJ!$M+B!!U6@!!1,AJ!#TH`#r!!')MS!!QZ)!3,rr`3!)S)!!QZ%!32rr`3
+!)XS!!QZ!!36rr`3!)a)!!QYm!3Arr`3!)eS!!QYi!3Err`3!)k)!!QYd!*!T5!"
+)!$B!0J!"!!%!!!!$!!N!&3"D!!)!!"PN!!+NcJ$,!!S%8M&$-31,AJ!$Lei!!)Y
+H!!1-TJ!#T0B!!iYH!!+Pl!,m!!BL1J!#DiJ"![rr"!!LJJ!#Di3"!rrr"!!LbJ!
+#Di!""2rr"!!M%J!#Dh`""Irr"!!M@J!#DhJ""[rr"!!MSJ!#Dh3""rrr)!')qJ#
+3"!%!rrmJ!BP#!*!%!3(rrb!"LKJ!!!!-!"J!@3!-!"N!!U9Z!!+PC!!(!!B!$!!
+B!GN!$!'C!!)!!!!'!!U!"J!!!!1-T[rdrqF!!SRN!!)!N!F$!!+PS!!#TDJ!!J!
+#TDS!!U@d!!+PXJ!!!!+)h!!1!!+)i!!!!"8!@J!#!!!CC!!#T-i!b`!+"&)a3c%
+$Lei!!iYH!!#,AJ!$M+B!!U6@!!1,AJ!#TH`#r!!')MS!!QZ)!3,rr`3!)S)!!QZ
+%!32rr`3!)XS!!QZ!!36rr`3!)a)!!QYm!3Arr`3!)eS!!QYi!3Err`3!)k)!!QY
+d!3Irrb!"L2S!N!3"!2rr)!'*3J#3"!%"rrmJ!BSB!!!!$!!B!&N!$!!C!!+PEJ!
+#T@3!"`!'!!`!'!(C!!`"Q3!#!!!!"J!+J!B!!!!$M+Erp2rR!!+*j!!#!*!(!`!
+#TD!!!U@S!!)!!U@U!!+PY!!#TE)!!!!#L0`!$J!#L1!!N!ErN!3!N!X#!!%!!!!
+m!$`!2J!q!$i!!J"!!%!!3J#3"IX"f!!-!"N!q`(B!*!&&!!(rqIrp-!!N!C9!&8
+!$!!C!&8!93#3"3F!!IrRrr6!!!!!)!'Q+N'8!!!"!!!!!5m!!!![!!!!4J!#TDJ
+!!J!#TDS!!U@d!!+PXJ!!!!+)h!!1!!+)i!!!"f9YF(4j69!#!!!!69"#6P"-38i
+!N!S0*!!!69"#6P"-38i!N"M@DUXH!!!(R!!!!A8LbJ!#Di!""2rr"!!M%J!#Dh`
+""Irr"!!M@J!#DhJ""[rr"!!MSJ!#Dh3""rrr)!')qJ#3"!%!rrmJ!BP#!*!%!3(
+rrb!"LKJ!!!!-!"J!@3!-!"N!!U9Z!!+PC!!(!!B!$!!B!GN!$!'C!!)!!!!'!!U
+!"J!!!!1-T[rdrqF!!J!!!!F'4'pXE'&b!!!!)#iX,#3!!0!!!#rrB#""63!J8%d
+!1J#3#J%!!!%!!!!",`!!!#m!!!"'!!*VQ!03!!!!(!"'!!&69&)J!!!!%NP19%`
+!!!!H!9lrr`#3#[rr)!!!#`!#L23p+3:
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/pass/Wingz_1.0.hqx b/writerperfect/qa/unit/data/calc/libmwaw/pass/Wingz_1.0.hqx
new file mode 100644
index 000000000..7fcbae307
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/pass/Wingz_1.0.hqx
@@ -0,0 +1,28 @@
+(This file must be converted with BinHex 4.0)
+:#90SC@9d,RGRHJ"A@P069dj(@J%!!!!&f!#3"(JV9dj(@PGD8e-`-6%`!!#!FJ%
+!N!SFah%Fah&X2`!!!"6rrrm%!!!!!Iq3"!!!!!(rrrm""3!8!"3!!!$qr`#3"J)
+%!!!!&2rrr`3!!!!"rj!%!!!!!Irrr`%&!"3!&!!!!2lr!*!'!J3!!!!8rrrr"!!
+!!!(rN!3!!!!"rrrr!38!&!!8!*!%&2rrr`%!!!!"rrrr!38!N!3"rrrr!38!N!3
+%rrrr!38!N!3(rrrr!38!N!8+!3C(C@jPGQ%!N!JG!!!!"!#3#`a"99428d&@45j
+A5eS!N!6`)`!b!*!-$!!$!!3*!*!%C!!!!2pr!!$rI`#3)2lr!*!'r[m!N!Eqr`#
+3"[lr!*!'r[m!N!Ba!!%!!!!%!!F!N!Iqrrlr!*!)"!!#!*!*!3!!!!%!N!d&!!X
+!E`"T!*!M!B!3!!!!rrm-!`3!b!8&!0`+rhr)"3+!#!!!!2rrm!$rIr!!!i!!N!3
+%J!#3"!9!#!!!!!J!"3X!!`!!#%!2!!!!!3#3""J!N!E`2rm)3!i!!3!"!*!%'3C
+K)(4PH(6r#%!B!!)!!3#3""J!N!E`2bd!N!B)32m)3"i!!`!"!!!!""J!N!E`2b`
+!N!B)3!%!N!3Zr`P!)!!!!"F!!!!+!*!(&2rrr`(r!!!"!*!%"NGPEQ9fB3P!)!!
+"!!%!!!!+!!%!N!88rrrr!Im!!!%!N!3'4f9ZCACK#8!J!!)!!3!!!!S!!J#3"46
+rrrm"r`!!!3#3"!C(C@jPGQ%*3#!!!`!"!!!!#J!%!*!&&2rrr`(r!!!"!*!%"NG
+PEQ9fB3P!)!!%!!%!!!!+!*!(&2rrr`(r!!!"r`!!!!C(C@jPGQ%*3#!!"3!"!!!
+!#J#3"a6rrrm"r`!!!3$r!!!'4f9ZCACK#8!J!!B!!3!!!!S!N!F8rrrr!Im!!!(
+r!2m!"NGPEQ9fB3a!9`#3"38!!`!5!!!!rrm-G'9iG#KZEh*YB@`T!J!5!!%!rrm
+%BQpXC!)!%J!#!2rr"QPdB@aTB`-!%J!$!2rr#A9ZC'9bE'PZC3!$!")!!!$rr`T
+LD@FJBfpXG@eZ$%!U!!%!!!!#!!)!%J!%!2rr!h*PC!)!%J!&!2rr"@GbC@9Z!J!
+5!!B!rrm(E@&RC@jdB3a!1!!#!!!!!`!#!")!!!$rr`9KE'PREJ)!%K!!!2rr"'a
+PCR3#!")J!!$rr`CMC@jdCA)#!")`!!$rr`9bD@GSG!a!+!!%!*!&!`!5!!!!rrm
+IG'9cG#"[CL"ND@CQCA*PER3JER9YBQ9b)'C[FQeKG!a!8!!&!!!!"!!&!")!!!$
+rr`#3"d!&!#)!!!$rr`#3"d!&!$)!!!$rr`#3"d!&!%)!!!$rr`#3"d!&!!)!!!$
+rr`#3"d!-3"X!"`#3"3-!%J!!!2rr%R0[E@8JC'&dC5"KEQ3JG'PYC3a!8!!)!!!
+!"!!&!&)!!!$rr`#3"D#E3!8!BJ!!!2rr!*!&'*a!"3#5!!!!rrm!N!6!#H"!"3#
+L!!!!rrmTA)r#p5M-2`8!dJ!!!2rrQTQ3"HNr$%!9!!S!N!8$!")!!!$rr`acEfe
+P)'C[FQeeE'%-3$m!#`!!!!-!*3!5!*!,m$mL!")!!!!"!!CK)(4PH(3P!")!!!!
+#!&@3"Y8r*3!5!!!!!`#3"a"!%S!!N!36J!#3"2m2!!!"-!!!:
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/pass/WordPerfectWorks_1.0.hqx b/writerperfect/qa/unit/data/calc/libmwaw/pass/WordPerfectWorks_1.0.hqx
new file mode 100644
index 000000000..5fae0005f
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/pass/WordPerfectWorks_1.0.hqx
@@ -0,0 +1,45 @@
+(This file must be converted with BinHex 4.0)
+:#A0SC@9d,RG`G`"#9h0c3PGVF`%!!!!(J!!!!@,GiN*ADh0#9h0c3PGcF`#3"3%
+!N!F"!*!'!3F!N!3&M!!*!!!!#3#3$!%!N!3(!!%!$`!!!%J!5!#3"!,`!N$rmIr
+Z!`N#8Q-#"5J$r!%!!!!"D!&S!*!%$V!,3!!"!3!!C!!"!!!!!3!#!!!!!5F2!!%
+!N!i3!*!*%!$rYIqQ$bd,QJ!)!3#3$4N"!!!""`#3#!%(!*!i"NGPEQ9fB3!Z!!T
+`FQ9Q!*!(A4fF!&dIR!!!!33$!J)"!3%!!3!+!!!!)3!$!!F!$3!$!*J#*J!"C'p
+cG3PK!*!&A4fF!&dIR!!!!%J!!!")!!!!5!!!!%J"!3%!!LCQEJ!))!aQ%(!`,`"
+1V36D+%!J$&K2Cd3[$%kY!$SS3#"8)+hNU#"-S#NJ9%*S!!3J9%*S!!BJ9%*S!!J
+J9(!!)8!!#L"85'J!$Mmm!qP`$cm!6Ud$FL"-S#TB6b!-+'lrr%jH6R919J!!,``
+SEJ!))!aR-#"8)+hNU#"82bJ!"+QD)!aR(R!!,`![$%kY!%)J,J!-#!!!!&"2C`J
+[$%kY"1*B6bKZrra1ANje6PErqNMR!4JSEJ!))%bJ+9@22cb!!#mmF(*PCR!"(`"
+)E[rk5'lrr%kY!c)q(fCQ9Bmr,[rk,blrr#"85'J!$Lmm3PGVFbmm8h4KGdkY!ZS
+q(`G3B@GP)#C`)&4)D!!16Ud$+P@22blrqLmZrr`J9%KS!!j`!am!6Ud$)L"8-9m
+!"#"8-@lrqJ!))&3KE[rm!!TJ!!#LF(UM(LC),`Y1V3QL)&4"k!!1*dJ!%L"8*fJ
+!#J!`)&3hD!!)!"C9Mbm,F!!I!%kY!Q*1V3QbF!(!+`!HFJ!5!%U"CbC9Mb"82bJ
+!##mS!!T)D!!16Ud$#R!,,`")H!2V6Ud8dNr[!!TJ&%TV!"KR$R!,,`")H!2V6Ud
+8dP"2)%ZJ(e@2)&3r+!!),bJ!#NKS!!j`!am!6Ud$)L"8-9m!"#"-S#T-lKL!rqj
+1ANje6PErr%MR"aJQEJ!-+'i!!3!23!!"!*!%"`!)rrm!N!KU!!$rrr#U)&!aI2r
+[!!-!"3"U$L$`UL*4)dJ"!'j[FQeKE!`J!!S!!`J!!(0LEfaN$L!!#J!$%!!!FfP
+dB@aTBa%J!!S!!b!!!(0eEQ4PFQaTEQ9S!!!5)2#U)&!aI2m!BQPR)'0[E(9YEJ!
+"!!!!C!!!!"Fr2)!!,ca`BJ!&!!3!C!XJ!!S!!`)!!(0bC@3I$5!!#J!$!`!!FfG
+bC@9ZD!`J!!S!!`3!!(0LE(9P%5!!%J!$!!!!Fc%i)("[D@jdF`i2)!!+!"B!!!"
+cBfpeFQPPFQJ!!J!!!&!!!2rr!&1jF!"c!!8!!`!$!&!0)!#3#'&XD@GZ!!`J!!S
+!!`!!!"0XC@Cd$L!!#J!$!!!!8f0PER4PFJdJ!!S!!`!!!$0bD@GSG"!!!`!!!$)
+!!2rr!&1jF!#!!!8!!`!!!$)H)!#3#(0[E@8JER9YBQ9bD@jR)'C[FQeKG(-!"!!
+!!)S!!2rr!*!'!3S!!`!&!)S5%!"RkBS!8lN!2rc-N!J5%!!+!!-!)J"c2rc-N!J
+5%!!+!!-!3!"c2rc-N!J5%!!+!!-!B!"c2rc-N!J5%!!+!!-!JJ"c2rc-N!J5%!!
++!!-!LJ"c2rc-N!J!"3!!!$B!!2rr!*!'!33!!`!!!$BK)!#3"(rrI`"cEfeP)'4
+KG'8JEh)JG'PYC5"QEh*YBA4c!!!'!!!!E!!!rrm!N!Em4!!$!!3!E")3!!S!!`#
+J!(0!$Ca!!*!'%K!!#J!$!-!!Fd!0kQ!!N!B5%!!+!!-!`3"c3!kF3!#3"K)3!!S
+!!`$%!(-rrS!!N!F))J!+!!-!a`"c!!F!!!!S!!$rr`!!!!`!!I`N!!-!!!!S&#!
+!!Ia-FfpY!(0[E@8JCQpbEA9XB3!)!!!!CJ!!rrm!!!!-!Q8!!!!$!!-!CJqJ!$3
+!N!3"!!!!B@*MC'8!&*!!!!!!+J*PI`!!!6rrJ!#3"a53!(rr!Am!N!8#2rkUN!H
+V&*!!!(-!!!!m!!!!!crre9@3"PB!!3![!J!&!!!!$J!!!%X!4J!!!!)!,!#3"8X
+!4J!!!!)!,!!"!!%!A`"'!!!!!J!X!!)!!!",!%B!!!!#!#`!!`!!!%X!4J!!!!)
+!,!!%!!%!N`"'!!!!!J!X!!8!!3!&!J!)!!!!#JB'B@*MC'8!!`!!#!!"!!F&!!!
+!!30P!!J!!J!6"3!!!!)&!!!!!`i"rrq!!!d$!!!)!!-!$3,rrS!!rrq!!&N"!rp
+!!%!!!3%!!3%!N!N*!!-!#J!%!!N!!f)F!!!"!!!!!4`!!!!F!!!!4J!Y32qS28E
+rV%(Zria`"k*J2J!JEJ!-)+lr[$!(61i3#bTcD'9PG#jhF(F`!J!!!%*AFh0#9fY
+c!*!+3PGcFd*ADh-!N"M2XLAS!*!'!@)&,J"5Kf!F)!B#J!!!!!p)J"Qc!!"i!#!
+'FK"1V32b,!"6Kh!"X)GYhNcZ'1MreNjH6R8`-6)c0$8f0cJj38*$4%9'!!"19[r
+m51F$'#CZ!!`m,J!5)'i!#%)3+&086(i"B!a`!"!88N$B`#!(8SG)aVb(EZjCMbm
+-6Ud$HR!!%"63!!!!$!Y#C@&RE'9AEh*VF`!!!!J!6J!#!G`#GJ!!!3!!!!%F!!!
+!(!!!!%B!A5"d'R)!!!!F!%B!!9088L!!!!!5Ge"[F`!!!"krp2rr!*!&A4UF!qR
+rr`!!!"!!N!6Y6J:
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/pass/WordPerfectWorks_DB_1.0.hqx b/writerperfect/qa/unit/data/calc/libmwaw/pass/WordPerfectWorks_DB_1.0.hqx
new file mode 100644
index 000000000..f9790361d
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/pass/WordPerfectWorks_DB_1.0.hqx
@@ -0,0 +1,176 @@
+(This file must be converted with BinHex 4.0)
+:#@4KG'%ZGh"h-3"#9f4L3PGVF`#3"#3M!!!"BX#C3PGVFd*AC'*#9f4L!*!&!3#
+3"`%!N!B""`#3"!@-!!N!!!!*!*!-!3#3"!F!!3!2!!!!5!")!*!%![!#32rarqi
+$#3*5B`)&+!2m!3!!!!&S!@J!N!31X!Y!!!%"!!"N!!%!!!!"!!)!!!!"*`m!!3#
+3$K!!N!N3!2qerkB2,3ZD!!J"!*!0'3%!!!%(!*!)!3F!N$J'4f9ZCACK!LJ!!@4
+[Fh8)03#3"9dGC!"G)$3!!!")!!!!5!!!!%J!!!")!*!&!3)QCMi!N!3$F!"4YjJ
+!N!3"+`#3"@6cjJ"6bQ`!8mUN!!!!!3#3$Jp6G(PXC9GbDA4PFL"-EfF!N,S(8'&
+RC5!QF!#3q5i!#R"bC@B!N!GG(@3!A5!d!"-""!-#!J%"!3!"!!S!!!!K!!-!"`!
+0!!-!N!8X!!3!2!!!"(4PH(3%4QpZG!!EC`!%8fPkC3!ED!!&8h4jE'8!'fN!"80
+[E'pb!"YU!!%Y!*!%#J"S!&dFi2rr!-N!2!!!"QjeE@*PFJ#61!!!!!B!N"419[r
+851F2'#CZ!"!SEJ!)!8F!A4cJrrm!#!!m!!!%C'&dC3)!!)qi!!!!$J#3&%j@!!!
+[$#KZ!!J[$#"X!!)#D!"G(1$rr`$m!$`!!!4dD@eP!NS!@%pR"M!Z!!jJAL"X!#J
+J8#"S!")Y52rm)&!QD!")5'i!$Lm,6Ud,1Mi!!dF!A4cJrrm!EJ!!!#N!!J!#EJ!
+!!!G-BAP[GA3a!*!BA4bd!&dG#!"G(-3!#!%!N!Rrrmqci(3!A4eN!&dF`!#3#8J
+!!!")!!!!5!!!!%J!N!8"!LCQQ!#3+f6c2[rr!!!"%!"4YjJ!N-3(8'&RC5!QF!#
+31@6cMJ!!!-J!8EHB!*!,C-0+!!KTB!!)!!%!8m$`!&2'r!"6a0B!N&&6c(`!N%B
+"N!3!!3#3"%E!!!!!#`!!P9J!N"K19[rd51F6'#KZ!!JJ$'B55(J#D%kY"0SS3#!
+-@%pR!!3XGJ%J$'B8,`0`"Lm!6Ud%fPL2*Kp+J'B#GJ"+!fFB,`a1V3!k)&3JVI!
+k)&4#D!!%F!"B6f!#F!!S6#"8)+hb&L"83LJ!"b"8F!!K3!!U)&3K3!!Z)&3K3!!
+Q)&3K3!"))&4#+!"-F!![!%kk#$3J9#&!!#CBMbm!6Ud*SR!!*N"f!5),CKB[!h!
+1,`"1V36D@)mQ(bC!)!YQ!RB!5J0R4RB")!YQ&#m$F!`[!2rr!!"BMbBI5S"Q!RB
+!5J0R%Lm,6Ud,+L"6)#hN6L#!@%pJ!R!!*NXJ8b#Ym,JJ8c&m!(8!$("eB!*`!#"
+8)8X!5#m,6Ud*SL"83QJ!-L"8)@i!$!"%IJ%J9"&(!$3J9"&m!!%!08)()&344`!
+f)&4#+!!k)&3aI2rr!$j)H!A'6Ud'bL"8)8!!+L"8,bJ!+NkY#D)J9#mS!#T1V3F
++@)m[!%kY#D*#4hB'@%p)ab"8)'J!+L"3)!FL!-$m!24)3F,m!24)38*"d)%a[2r
+r#!*)ab"8)'J!+L"3)!FL!-$m!24)3F,m!24)38*"d)&#-!J%5-Irr`!!!#SJ8#!
+()J$!r!$d5%(#r!$d5%&#3G#"3M!)"6!(8NHf4fk3!#"8)'J!+L"33QJ!!L"8)'J
+!+L"3-,`!!8*(GJBJ9#"S!#SJ8%(S"F"#-(!!)&3JD!!U)&""k!@k%E`!!R!!-!G
+54lC(EYBJ9#mS!#T1V3FU)&3[+!!U6Ud(%NKi"B41V3E+)&3K3!!Z)&3[+!!Z6Ud
+*SL"8,bJ!,NkY"`TBMbm!6Ud*SL"8)'J!,L"33P"#4hB*6qm!$%M()&3JD!!Z)&!
+J"q@!-Ecrr`J+3NCd&'"-5-FJ9#"S!#iJ8#!()J$!r!"m5%(#r!"m5%&#3Irr!!!
+!K%*`#!")ab"8)'J!,L"3)!FL!-$m!(a)3F,m!(a)38*"d)&#-!Jd-!C54V4'EV!
+`"e*(YNGZML"8)'J!,L"3-Acrr`9F)&3JD!!Z)&"#D!9D)&3JD!!Z)&"#+!9B)&3
+JD!!Z)&"#+!9C)&3JD!!Z)&"#+!8b)&3JD!!Z)&"#+!8+)&3[+!!Z6Ud(+L"8,bJ
+!,NkY"a)J9%)S!$FJ9%)S!$JJ9(!!)8!!6P"2)&3JD!"%)&!YD!#)rr3[2'4[Fh8
+JE[rd,`JJ8#"3)QJ!$%k4*N"36b"6,LJ!'#"8)8F!8L"6,LJ!(#"8)8F!9L"6,LM
+rr`!!)8F!@L"6,LJ!*#"8)8F!AL"6(LJ!+5"8%8F!Bb"6(LJ!+L"8%8F!C#"6(LJ
+!+#"8%8F!BL"6(LJ!+b"8%8F!C5"62#J!,#"8-8B!CL"-S#NJ5k!T)&0"k!!Z,8M
+rq#m)5(J!rb"85'J!D%kY%FSJ8d(S!5iY52rm,`K)H!$r)&4)D!&S6Ud4bL",S#S
+J9%(S!%!JZ!)-)%bJ+Nr[!"JJ$%cZ'-Mri%jH6R919J!!)'i!##"3ASJJ#%jH6R9
+19J!!51F"'#CZ!!`SEJ!)F!!3%ci!8NF-4`!HE`*q(L",)P4HL8M()!HJ,L"8%@i
+!%`!'rrm!!2rd6Pj1G8j@!!")j`!S+'i!##"8ASJLEJ!-*&33+J!(5)"53%M!S#i
+J9#*Z!"!5U!!'61i8!2ri6Pj1G8j@!!![$#KZ!!JJ$'B35(J#G%kY"0SS3#!-@%p
+R3LmZ!!`[$%kkq[`S3#"8)+hai#"8F!!K3!*S)&4#+!*X)&34I!!"!R!J9"&m!!%
+#F5"8%A`!!3*b)&34I!!"!R036b!-+'lrr%jH6R919J!!51F!'#KZ!!JJ$'B35(J
+#D%kY"0SS3#!-@%pR,#mZ!!`[$%kkqT!!+%!J9##YmH4`!#m!6UdZ`LC!,`Y1V3Q
+L)&3K5`"16qm#N!B!N!K19J!!,``SE[rr)!crrh"#rrp1VIrr+%$rreK2rrm`,[r
+r5-$rrbmZrrm[$%kY+cSS3!"8)+hb+#"8)@i!&!!k)&4`!"!S!$J-3!!&6qm!$#!
+-+'lrr%jH6R919J!!,``SEJ!))!aQ%(!-,`"1V36U+%!J$&K2C`j`rbm!,`a1V5C
+b!!"36b!-+'lrr%jH6R919[r151FI1#KZ!!JJ$'B5F$![!%kY"0SS3#!-@%m!!!(
+3GJ%J$'B8,`0`"Lm!6Ud%fPL2*Kp+J'B#GJ"+!fFD,`a1V3!k)&3JVI!k)&3aI!"
+C!!4`@9K2B!*`!#K-)&3JVI)J)&4)D!!+6VVrAJ!!)@i!$!!'2A`!#[rd2A`!#[r
+bI!jq3AS$)&4(k!!+2Acrrrrf3J4`!"!%!)!hE[rf!!*+VJ!3@%pR!!$S)&4"k!!
++,8Mrr#"Z!"!J8#"S!)`Y52ri3HJ!+#C))'lrr#*,4HJ!"#6C*0NJEJ!3)&!JD!#
+d,8MrjL"3*QJ!!#!,C`!!SL"6)'J!*Le)rpSJ8$JS!!B[,J!36UdR+LC!@%mJ8c`
+S!#j54J!*cqJ!,#"61LJ!-%T%Cc)`"&0!5-![!#mZrpT1V8@5,8$rcLm!5'lrdNk
+Y3bSpE[r8rr3`,[r@@%!p32rb6qm!%%KZrpi[#dkY*YS3,[rL!!!#J!!!!"q![!!
+!!!%#,J!(rq)L!1F*JblriL"83qlrhNAS!"BNf56C8%m!E[rU,blrmM!(d'lrp$m
+!-!E3E[rb2`#STb"83qlrkNAS!"iNf56C5'lrkM!Zrr"63$m!2blrmM!(d'lrm$m
+!-!E3E[rb2`#STb"83qlrkJ!!!#BNf56C)&3a43!Z)!a-lKcirkj1ANje6PB!!%M
+R%!JSEJ!))!aQ%(!3!!"1V36D+%!J$&K2Cd*f!5!-CK3[!h!3,`"1V36D@)mQ(dU
+!CJ*f!%S$CaS[$%kY#USJ9##Ym$iJ9$&m!&S!$("D@%pJ!R!!+%`J9##YmL3!!%c
+Z%!Mrq%jH6R919J!!,``SEJ!))!aQ%(!H,`"1V36D+%!J$&K2CaS[,J!3,bi!$#m
+-6Ue'ULK!)&3JVI+)6qm!$#!-+'lrr%jH6R919J!!6Pj1G5"8!!!24!!@N!"T!")
+p32rqB!`pI!,3rr`pI!)FrriJ,[rm+'lrq!!!6R919J!!51F"'$iZ!!iSEJ!))&5
+qD!!mCb!QD!!N-8F!2#!,Ca3[#dkY!#S[#b"6)&!LD!"F6T&36dcZ')$rp%jH6R9
+19[ri51F6'$iZ!!iSEJ!),$`!C!!!,bhYi%kY&q)Y32rmF'X[!#mYlH"1V4ID@)m
+[!%kY&VS!!!a(J!"2l`!-CK"`!"m!5(S"YNkY#C*J!!'N$%GrrfBd)&3YD!!NrrJ
+J9!"(!$T+V[riC`!"L#mZrrK1V4`U)'lrq#m))&!J8#*S!&a1N9"2B!!"DJa(rrj
+X"(lqB!J-4`!$E`*q!b"8[QJ!1QG',@J!*2ri)&3a4`!k!!$rq'FD,blrq%kY(#S
+JE[ri,`JJ8#"3)QJ!A%k48%mJ9#"S!'BJ8%TS!!KR$#"8,bJ!CNkY$h*B6dT(Ea!
+J"ZqS,`![$%kk!6*36f!85-FJ"d5!)JEJS5m",`a1ZJ%F8%mJ9(!$X'J!1QBQF2m
+[!%Ki"")[,[rm6UdF8R!!,`")H!34,blrr%kY(&*2l`!BB&3J9($qX'J!1QBQF!!
+[!%Ki"")[,J$m6UdF8R$r,`")H!34,blrr%kY(&*2l`!BB#4`!#m!5(J%%LmZrr`
+!V4a5F!![!%Ki""%[,[rm6UdF8Nr[!"K9Mb"6,bJ!"+P32KpJ'J#3"2rr,`F[#b"
+6)&!LD!")6T&2l`!-8dG+4flL)&4`rV"S!$TZ*R!$X'J!N!9D!!3!!!",!!S!!`!
+!!(-!#J!$#!!!F`!+!!S!'!!Q!!S!*3!B!'8!!3",!!S!!`!!!(-!#J!$#!!!F`!
+F!!S!+J!l!"`!1J!U!(S!!J",!!S!!`#J!(-!#J!$#!!!F`!Z!!S!2!!Q!#i!*3!
+m!'8!!`",!!S!!`$%!(-!#J!$#!!!F`"!!!S!6J!T!%!!+!"1!'J!%!"e!!J!!!!
+"!!)!!`!%!!8!"J!(!3*L!!!""daKH@peG$*3)QJ!5%k46qm!$%cZ'-Mrj%jH6R8
+X9!"G(*`!A4[8!&dEd!!)!3#3"'%!)'j[rrr2Xq"e!&dGC!"G(+3"H3"G()`!!!"
+)!!!!5!!!!%J!!!")!*!&!3)QCJ`!0L!-@%pR$%Ki""-[$%kY'4T36bKZrra1ANj
+e6PB!!%MR!4JH,J!2+'i!##"8[LJ!8@FD*QJ!*"&(!&%J#fF1,`XJ8b"3)QJ!A%k
+4@%p-lKL!rr41ANje6PB!!#"Z!!JJ8"&Z!!m!8NjH6R919J!!51F"'"iZ!!mSEJ!
+))&5q+!"6CaSQD!!N%8F!8b!,C`i[#b"6)&!LD!"F6T&B6dcZ')$rp%jH6R919J!
+!51F$'"`Z!"-H,J!2+'i!#%S'C`JJ9,iS!&KQ$%S'CMBJ9,iS!&PR,L"8*QJ!*%S
+'C`B44`"BB!BJ9"&(!&NJ#fF8,`Y1V4`U,`XJ8b"3)QJ(8'&RC5!QF"M!rr"1ANj
+e6PB!!%MR!4JH,J!2+'i!##"8[LJ!9@FJ*QJ!*"&(!&8J#fF8,`Y1V4`U,`XJ8b"
+3)QJ!A%k48%p-lKL!rr41ANje6PB!!%MR!4JH,J!2+'i!##"8[LJ!9QFJ*QJ!*"&
+(!&BJ#fF8,`Y1V4`U,`XJ8b"3)QJ!A%k48%p-lKL!rr41ANje6PB!!%MR!4JH,J!
+2+'i!##"8[LJ!@QFD*QJ!*"&(!&SJ#fF1,`XJ8b"3)QJ!A%k4@%p-lKL!rr41ANj
+e6PB!!%MR!"JSEJ!)*QhNEL"6)#J!)!5!3e0dH@FF")!`$qccCK`J8c!S!#C)`#m
+!!!%!N!3J#fFX,`XJ8b"3)QJ!,%k4,8$rr%KZrrLSG#mZrrbSFbmZrrLSFh!",`!
+[$%kY&j*-lKJ!rr"1ANje6PEr!%MR!aK(l[m!2#i!$LKZ!!K)aLm')&3[+!"Z6Ud
+,NMi!$%Irre"2CM3r"Lm,U2p)aLm',`XJ9#mS!'j1V3Yk5-B["L"8,bJ!ENkY#j)
+q!!a(rrp2l`!8CJ4`!'!#%!G-lKM!r["1ANje6PB!!(!!%#i!$bm!)'i!##"3,bJ
+!ENkY#i*1ANje6PB!!%MR!"JSEJ!))&3QD!!q)&0+8'm-)Qi!$$0S!!)!"Q!+)'i
+!$$&m!!2rr`!!*QJ!3L"65P"[#L*Z!!`bU!!#B!JJEJ!--,`!$#"8*QJ!4L"65P"
+[$#*Z!!`cD!!#!!4J#L"Z!!`aI!!K!!49Mb"8,bJ!5UKV)'i!$$&I!!*-lKJ!rrK
+1ANje6PB!!%jH6R919J!!F!&1ANje6PErq(!!,8$rr#e!rrJJEJ!)3qlrq#$C)0P
+1ANje!!!)a2rr!!&m)`#3"3(rrm!"Ic-!N!6m&rrr!!'#!3#3"1!#rrrd!B-0!*!
+%i!%!$I3"XFN!#'Rdi!!!%[!#$5-!#'RShrm!'I!#%[F!#'SJhri!*I!#69F!#'Q
+3!0rp!$$rr`!!!!KTM0rm!%B`!PFp!*!%hrX!96!#X`F!N!6IqJ"Pm!+h)3!)D9c
+Iq3"b-!,VU`#3"0ri!(``![iP!*!%hrF!J6!$!EN!N!6IpJ#0-!-+``#3"0re!*I
+`!`c4!!KTG0rd!*c`!c*&!!KTf0rc!+-`!d1K!*!%hr)!Uc!$E5N!N!6Im3#k-!0
+`m3#3"0r`!-F`!i2M!*!%hqm!dM!$L,-!N!6IlJ$J-!14E3#3"0rY!1d`!j`(!*!
+%hq`!qc!$U)d!N!6Ik`%0-!1U8`#3"0rU!4S`!pY[!*!%hqN"*6!$flRrr`!!hqJ
+"-6!$h#%!N!6Ij`&!-!2FN`#3"0rQ!8X`!r(A!*!%hq8"9M!$mcN!N!6Ij!&K-!2
+hJ`#3"0rM!@m`!rIT!*!%hq)"Ic!$q$8!N!6Ii3',-!3B!`#3"0rJ!CN`""k6!*!
+%hpm"S6!%Aa-!N!6IhJ'X-!4MI`#3"0rG!Ed`"'5I!*!%hp`"d6!%CP%!N!6If`(
+R-!4Rl`#3"0rD!I3`"'LR!*!%hpN#!$!%D88!N!6If!)2-!4UI`#3"0rA!L!`"'i
+E!*!%hpB#+$!%Em%!N!6Ie3)a-!4aR`#3"2rr!!!`"('h!*!%hp-#4c!%RI%!N!6
+IdJ*1-!5Mi3#3"0r4!PS`",EC!*!%hp!#CM!%ZTN!N!6Ic`*a-!5pX`#3"0r1!RS
+`"1hK!*!%hmd#KM!%lrN!N!6Ic!+4-!6cY3#3"0r,!TX`"3Ba!*!%hmS#SM!&"p8
+!N!6Ib3+Z-!8@4`#3"0r)!VN`"4KM!*!%hmF#ac!&'4N!N!6IaJ,D-!8Dc3#3"0r
+&!Z``"4Y[!*!%hm3#q$!&(id!N!6I``-*-!8Sf3#3"0r#!aR`"5[K!!KTi0r"!b!
+`"85h!*!%hm!$+rrr!*!'hlm$06!&C58!N!6I[J0(m!9PP3!)DBMI[303m!9QP3!
+)DB6I[!0Dm!@')`!)DGcIZ`0Im!@)J`!)DAMIZJ0P-!@*f3#3"0qj!h3`"BUA!*!
+%hlJ$JM!&Q!F!N!6IY`13!$!&Q-m!N!6IYJ1M-!@PT`#3"0qe!l8`"DaA!*!%hl3
+$[$!&V+8!N!6IX`2--!@bV`#3"0qb!pi`"Ehr!*!%hl%$m$!&`F-!N!6IX!2q-!A
+*B`#3"0q["!2`"GKC!!KTJ0qZ"!h`"GXh!!KTI0qY""R`"Ga"!!KTD0qX"#%`"Gf
+c!T!'!*!-'FJ!!2rr!!$rr`!!rrm!!2rr!!$rr`!!rrm!!2rr!!$rrdj@rrp)j`%
+B,Li!&!"Z!!`SEJ!))!aQ%(!@,`"1V36D+%!J$&K2CeB[$%kk$5JS3#"8)+hNT#"
+8)8X!$L"8%@i!%`!%F2q`KeK2CK`[#dkY$LSJ9#&!!")[#dkY!!!J9#&!!!C36f!
+1)&3KEHc-!")J9#&(!!BJ9(!!)8!!#L!-61iBJ2rd6Pi!G8j@rpa)j`%B+'i!##"
+8*QJ!$R!",`!JD!!5)&![+!!m6UdANL"8%#J!"&-!8%pP!!)k$!!!"')!!M*b!")
+!dN%b1a!'6[X3!!!B!!`#*!!!!6![$%kk"T4B6f!!!JiJ9#mS!"*1V5$k,8$ri#"
+8)'J!#U!T)&3JD!!+!&$rh#"8-#J!#%M!,`![,[rJ6UdC`NKZrqj)E[rX5'lrp%K
+Zrr!J9$!S!!K)`#m!,`Y1V3l5)'lrh#mS!!i[+!!+-#J!%NM!,`!J9$!S!!J!!#m
+!,`Y1V3j+)&3`+!!)5-![!#mZrq"1V4R#F!![!#m!5'lrr%KZrrJJ9!!S!!K)`5m
+",`Y1V3l5)&3JD!!5)&!YD!!mrq3`,[rZ5-![!$!Zrqa)`#m!,blrr#mZrrJJE[r
+F-#J!%NM!,`!`,[rZ5-![!$!Zrqa)`#m!!!$rp#mZrr!`+!!)5-![!#"Zrq3[##"
+3)&!LD!#X6T%J9#"S!!UJ+Nr[!)3!!!$f)&3`+!!)5-![!#mS!")[+!!16Ud2DLi
+!,`Y1V3hL)&3`+!!)5-![!#m,6Ud28R)!-J"+J5"8)8%!#L"8F!5`U!!+6qm!''B
+BF!J[!*!%#%M",`%[#dkY$eT2l`!-B"K`"Lm!)&3b+!!)5-%[!5m,6Ud2@Nr[!!`
+!#dkY$dT+3&E!4!")J%M!@)m[!(!(,`"bC5m",bhYi%kY&p)J9#mS!")JD!!5)&!
+J8#*S!%41N5e!rqJV314Q)&3[+!!5)'J!%L"3)&!LD!!!6T&BMbm!)&3[+!!56Ud
+JqPL2,`"1V5*k)&3[+!!5,`F[#dkY$GT2l`!S!1iBJ2r36Pj1G8j@rm4)j`%B+'i
+!##"8,@J!$[rmF!%[!#"8)'J!%L"3,bJ!2%kY&j)J9"!S!!46!&"2C3!#CJ`!!!4
+L!!*HFJ!5!0*"-MX!!%ll%!!!'!!-!P!"1!&%,`a1ZJ9D@%pJ!!)k@BqSf#eIrmJ
+J9#"S!!UJ+3"8)'J!#LC3)&3[+!!56UdJqLe!rm3J9$!S!!K)`#m!,blra%kY'F*
+)E[rU5'lrk%KZrr")E[rX)&3`+!!)5-![!#mZrra1V3l5,bX!"#m6!!!!#%M!,`!
+J9$!S!!K)`#m!,blrr%kY$NSJ9$!S!!K)`#m!,blra%kY'F)!!#m!,`")E[ri5'l
+rp#"8-LJ!#%M",`%[,[rm6Ud1dL"8)'J!%L"3,@J!22rJ-#lrkNM!,`!`,[rS5-!
+[!#mZrrJ[,[rd-#X!%NM!,`!`,J!!5-![!$!ZrqK)`#m!,blrm#mZrq``+`!)5-!
+[!#"Zrq![##"3)&!LD!#X6T%J9#"S!!UJ+LmZrmLSf8r[!)4J!!%D,`a1ZJ,`@%p
+J!!%1)&3QD!!5,@J!$[r-)&3`+!!)5-![!#m,,bJ!$NkY$fSZ!%KZrpT)E[rB,`X
+J8b"3)QJ!i%k4,8$rh#"8F!!`+!!-,`!`+!!)5-![!#mZrma1V3pD5'i!d#"8,bJ
+!%L"S!")J8#"3)QJ!-%k4,`XJ8b"3)QJ!4%k4,8$rj#Y!!'B[#b"6)&!LD!"%6T&
+BMbm!,`Y1V5$k@)m[!%kY)RS[#bm(,bi!N!6rreQ2,blrh%kY!5T`",#ICK)[,[r
+F6Ud(#R)!%J"+J9K2B!*b!8KZ!*!&@J!%!!$rr`!+!!-!!!"c!!S!!`J!!(-!(!!
++!#S!53!F!%J!+J#)!!(rr`!+!!-!!!"c!!S!!`J!!(-!,J!+!$`!53!Z!%J!2!#
+)!!,rr`!+!!-!S!"c!!S!!`J!!(-!3!!+!%i!53"!!%J!6J#)!!2rr`!+!!-!a!"
+c!!S!!`J!!(-!8J!+!'!!53"5!%J!B!#)!"!!G3!)!!!!!3!#!!-!"!!&!!B!"`#
+3"3F!"`#3"e`!!2rr!*!*!`!$!&`-)!!!!5q!!!!!G'pdEa)3!&1hQ!"6Y`"!!-!
+!N!F5%+T9UP@U9B!!3#d!!!!"(9S!!")3!!`!!J*FG!"!,3!!!!%l%%!X!!%!!!"
+F!!$rr`#3"`N!!`!$!&`-)!"RkBS!8lN!G(9dG4)3!*!)3!'!!*!(%K!!N!K!,3!
+!!!%GPJ!!%K!!$!!"r03!!%!Y!!!!!6X39CF!!J!!!&`!!2rr!'ITLJ"6Z8`!!`!
+$!&`-)!#3#(4TG'N5%,S)!*!'3!'J!*!(%K!!D!!!!!`!!%!Y!*!%p5S!!")3rI`
+!#J#3"%!Y!!!!!6X3D`3!!`!!!%B!!2rr,'jeE@*PFL`!!`!!!%Bb)!"RkBS!8lN
+!+'0[ER4KD@jc)$3JCQPPE'4c1L"dCAKd,'jeE@*PFLaNBA4P,(4TE@8T!!3!!!"
+8!!$rrfCTC@aN)$%U!!-!!!"82b"dG5adDA4T!#KTEL"QD@9XC#!a1L"dEh4[,(4
+eG(8XG'PdD5YdD'9cC5"QDACP)'0[E@ePER4c*b"XD@jPFbN!!!8!!!!`!!$rr`!
+S!"B!BJ!!!!-!!!!`'b!!#J!-!#J!!#KTEL"QD@9XC#!b1L!c,$3X05N@!!B!!!!
+q!!$rrb"QD@9XC#!M!!-!!!!q+L!a,c-a!*!%+'PZ)'CTC@aN)$-k)$%[-5md,$%
+[-c%[0#`a-Lma,cJj+3!(!!!!1!!!rrpQD@9XC#!d+J!$!!!!1#3J-$!X03#3"#K
+TEL"QD@9XC#!d1L!c1M!`,$3k-$!X06S`-#N!!!!$!!!!$J!"!%X!#J!$!!!!F`!
+!!!%!5`!+!!-!!!"c!!%!!3",!!S!!`#J!(-!!J!"!%X!#J!$!-3!F`!$!*!&!J#
+3"HX!!!!(!!%!#!!#!!F!!B!Q!!!"!!!!!4`!!!!F!!!!4L39!@El,K%"&`(I[2J
+m@`8!-iF2D38R"(N2SAU"!@Cl#bTNBA4K,RG`Gc%`!J!!!%*AC'*#9fYc!*!+3PG
+NBN*ADh-!N"M2Xq&p!*!'!@,$Lc`l'$Y,41&VSQXBf`,"L$X38`0$$S%!Fa9V+YX
+0!`-H#J"E@eT)#!SXH`!-SK`SKBci$d+i+5`P&!bSSZYMUe)2%R#E'%8l&Lcc9F-
+-Ue)qibI3%PX#a6964kJm9QX#9`8X22Ll"@DV8LN1J3`2!4)A!E5V8Q`2!#YT"%M
+K!'8'!!!!$!Y#C@&RE'9AEh*VF`!!!!J!6J!#!G`#GJ!!!3!!!!%F!!!!(!!!!%B
+!A5"8'R)!!!!F!%B!!9088L!!!!!5Ge"[F`!!!"krp2rr!*!&A4Lm!qRrr`!!!"!
+!N!6Kk`:
diff --git a/writerperfect/qa/unit/data/calc/libstaroffice/fail/.gitignore b/writerperfect/qa/unit/data/calc/libstaroffice/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libstaroffice/fail/.gitignore
diff --git a/writerperfect/qa/unit/data/calc/libstaroffice/indeterminate/.gitignore b/writerperfect/qa/unit/data/calc/libstaroffice/indeterminate/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libstaroffice/indeterminate/.gitignore
diff --git a/writerperfect/qa/unit/data/calc/libstaroffice/pass/Calc_3.1.sdc b/writerperfect/qa/unit/data/calc/libstaroffice/pass/Calc_3.1.sdc
new file mode 100644
index 000000000..683d1a85c
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libstaroffice/pass/Calc_3.1.sdc
Binary files differ
diff --git a/writerperfect/qa/unit/data/calc/libwps/fail/.gitignore b/writerperfect/qa/unit/data/calc/libwps/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libwps/fail/.gitignore
diff --git a/writerperfect/qa/unit/data/calc/libwps/indeterminate/.gitignore b/writerperfect/qa/unit/data/calc/libwps/indeterminate/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libwps/indeterminate/.gitignore
diff --git a/writerperfect/qa/unit/data/calc/libwps/pass/Lotus.wk1 b/writerperfect/qa/unit/data/calc/libwps/pass/Lotus.wk1
new file mode 100644
index 000000000..288d914c5
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libwps/pass/Lotus.wk1
Binary files differ
diff --git a/writerperfect/qa/unit/data/calc/libwps/pass/Lotus123_3.123 b/writerperfect/qa/unit/data/calc/libwps/pass/Lotus123_3.123
new file mode 100644
index 000000000..fa2154967
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libwps/pass/Lotus123_3.123
Binary files differ
diff --git a/writerperfect/qa/unit/data/calc/libwps/pass/Lotus123_98.123 b/writerperfect/qa/unit/data/calc/libwps/pass/Lotus123_98.123
new file mode 100644
index 000000000..1d3a7e752
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libwps/pass/Lotus123_98.123
Binary files differ
diff --git a/writerperfect/qa/unit/data/calc/libwps/pass/Multiplan_3 b/writerperfect/qa/unit/data/calc/libwps/pass/Multiplan_3
new file mode 100644
index 000000000..7639d78fb
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libwps/pass/Multiplan_3
Binary files differ
diff --git a/writerperfect/qa/unit/data/calc/libwps/pass/QuattroPro.wb1 b/writerperfect/qa/unit/data/calc/libwps/pass/QuattroPro.wb1
new file mode 100644
index 000000000..95a6331c9
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libwps/pass/QuattroPro.wb1
Binary files differ
diff --git a/writerperfect/qa/unit/data/calc/libwps/pass/QuattroPro.wq1 b/writerperfect/qa/unit/data/calc/libwps/pass/QuattroPro.wq1
new file mode 100644
index 000000000..fc1aae945
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libwps/pass/QuattroPro.wq1
Binary files differ
diff --git a/writerperfect/qa/unit/data/calc/libwps/pass/Works_2.0.wdb b/writerperfect/qa/unit/data/calc/libwps/pass/Works_2.0.wdb
new file mode 100644
index 000000000..d9a6a56ba
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libwps/pass/Works_2.0.wdb
Binary files differ
diff --git a/writerperfect/qa/unit/data/calc/libwps/pass/Works_2.0.wks b/writerperfect/qa/unit/data/calc/libwps/pass/Works_2.0.wks
new file mode 100644
index 000000000..b0c28eaa4
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libwps/pass/Works_2.0.wks
Binary files differ
diff --git a/writerperfect/qa/unit/data/calc/libwps/pass/Works_Windows.wdb b/writerperfect/qa/unit/data/calc/libwps/pass/Works_Windows.wdb
new file mode 100644
index 000000000..6fd378644
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libwps/pass/Works_Windows.wdb
Binary files differ
diff --git a/writerperfect/qa/unit/data/calc/libwps/pass/Works_Windows.wks b/writerperfect/qa/unit/data/calc/libwps/pass/Works_Windows.wks
new file mode 100644
index 000000000..a9b3d0277
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libwps/pass/Works_Windows.wks
Binary files differ
diff --git a/writerperfect/qa/unit/data/draw/libcdr-cmx/fail/.gitignore b/writerperfect/qa/unit/data/draw/libcdr-cmx/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libcdr-cmx/fail/.gitignore
diff --git a/writerperfect/qa/unit/data/draw/libcdr-cmx/indeterminate/.gitignore b/writerperfect/qa/unit/data/draw/libcdr-cmx/indeterminate/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libcdr-cmx/indeterminate/.gitignore
diff --git a/writerperfect/qa/unit/data/draw/libcdr-cmx/pass/fdo63782-1.cmx b/writerperfect/qa/unit/data/draw/libcdr-cmx/pass/fdo63782-1.cmx
new file mode 100644
index 000000000..013448f38
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libcdr-cmx/pass/fdo63782-1.cmx
Binary files differ
diff --git a/writerperfect/qa/unit/data/draw/libcdr/fail/.gitignore b/writerperfect/qa/unit/data/draw/libcdr/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libcdr/fail/.gitignore
diff --git a/writerperfect/qa/unit/data/draw/libcdr/fail/EDB-35217-1.cdr b/writerperfect/qa/unit/data/draw/libcdr/fail/EDB-35217-1.cdr
new file mode 100644
index 000000000..374503367
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libcdr/fail/EDB-35217-1.cdr
Binary files differ
diff --git a/writerperfect/qa/unit/data/draw/libcdr/indeterminate/.gitignore b/writerperfect/qa/unit/data/draw/libcdr/indeterminate/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libcdr/indeterminate/.gitignore
diff --git a/writerperfect/qa/unit/data/draw/libcdr/pass/EDB-35217-2.cdr b/writerperfect/qa/unit/data/draw/libcdr/pass/EDB-35217-2.cdr
new file mode 100644
index 000000000..7a15b4b01
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libcdr/pass/EDB-35217-2.cdr
Binary files differ
diff --git a/writerperfect/qa/unit/data/draw/libcdr/pass/fdo65220-2.cdr b/writerperfect/qa/unit/data/draw/libcdr/pass/fdo65220-2.cdr
new file mode 100644
index 000000000..aff705ffa
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libcdr/pass/fdo65220-2.cdr
Binary files differ
diff --git a/writerperfect/qa/unit/data/draw/libfreehand/fail/.gitignore b/writerperfect/qa/unit/data/draw/libfreehand/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libfreehand/fail/.gitignore
diff --git a/writerperfect/qa/unit/data/draw/libfreehand/indeterminate/.gitignore b/writerperfect/qa/unit/data/draw/libfreehand/indeterminate/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libfreehand/indeterminate/.gitignore
diff --git a/writerperfect/qa/unit/data/draw/libfreehand/pass/.gitignore b/writerperfect/qa/unit/data/draw/libfreehand/pass/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libfreehand/pass/.gitignore
diff --git a/writerperfect/qa/unit/data/draw/libmspub/fail/.gitignore b/writerperfect/qa/unit/data/draw/libmspub/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmspub/fail/.gitignore
diff --git a/writerperfect/qa/unit/data/draw/libmspub/indeterminate/.gitignore b/writerperfect/qa/unit/data/draw/libmspub/indeterminate/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmspub/indeterminate/.gitignore
diff --git a/writerperfect/qa/unit/data/draw/libmspub/pass/EDB-22310-1.pub b/writerperfect/qa/unit/data/draw/libmspub/pass/EDB-22310-1.pub
new file mode 100644
index 000000000..741676f3f
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmspub/pass/EDB-22310-1.pub
Binary files differ
diff --git a/writerperfect/qa/unit/data/draw/libmspub/pass/EDB-22655-1.pub b/writerperfect/qa/unit/data/draw/libmspub/pass/EDB-22655-1.pub
new file mode 100644
index 000000000..e3654a13a
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmspub/pass/EDB-22655-1.pub
Binary files differ
diff --git a/writerperfect/qa/unit/data/draw/libmspub/pass/EDB-29664-1.pub b/writerperfect/qa/unit/data/draw/libmspub/pass/EDB-29664-1.pub
new file mode 100644
index 000000000..18287fc15
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmspub/pass/EDB-29664-1.pub
Binary files differ
diff --git a/writerperfect/qa/unit/data/draw/libmspub/pass/fdo59355-1.pub b/writerperfect/qa/unit/data/draw/libmspub/pass/fdo59355-1.pub
new file mode 100644
index 000000000..607a07ae2
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmspub/pass/fdo59355-1.pub
Binary files differ
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/fail/.gitignore b/writerperfect/qa/unit/data/draw/libmwaw/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/fail/.gitignore
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/indeterminate/GreatWorks_1.0.hqx b/writerperfect/qa/unit/data/draw/libmwaw/indeterminate/GreatWorks_1.0.hqx
new file mode 100644
index 000000000..7ff1bd910
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/indeterminate/GreatWorks_1.0.hqx
@@ -0,0 +1,44 @@
+(This file must be converted with BinHex 4.0)
+:#'4bBAFa,QGh!&T23NTD48*5!*!%!qN!!!9R(1d"!&T23NS!N!X"!!J!#3!!!!%
+!!!!"!!%!N!3#m!*!!*!%![!#3!#3"!,`!N!&+!2m!%J!5!"M!!%!!!!"!3#3""!
+!!3!9!!!*5'9XGQ9dD@0K!*!%![!#3!#3"!,`!N!&+!2m!%J!5!"M!!%!!!!#!!)
+!!3!$QC!%rj!+CQBc-rrrCQB!!!!9!!!!$!#3#3%!!!B5!!)!!3!!!!`!"3!22rf
+N[(dC02F**%!#r2Yb6)H41E3!!3!5!!!!@J!!!!B"!!$3!!N!!!!"!*!'!8J!!!$
+8!!!!)J!!!"!!"J!f!`!!(3!!!'%!!!"b!!!"`J!!!!)!!!!"!*!H!3!!1!!!!+)
+!!!"'!!!"5J!!!!%!!!!#!!!!6`#3"!%!N"8&!!#*!!!!DJ!!!08!!!$1!!!!!J!
+!!!-!N"i)!!#,!!!!i`!!!33!!!'b!!!!!`!!!!3!!!"5!*!D!J!!I3!!!@i!!!#
+T!!!"LJ!!!!)!!!!&!!)!!3#T!!!"EJ!!!(d!!!'+!*!-!J!!G3!!!-B!!!#+!!!
+!jJ!!!!)!!!!'!!)!!3#+!!!!aJ!!!(8!!!$Q!*!0"!!d!!%!!3!!!!%!N"VrN!B
+!N!ErN!B!"!!#!!!!!J!!!3(rN!J!N!LCN!6rN!TQCM-crrpQCJ!!!!%!!J!!!!)
+!!!%"rj!)L!!L!)J!)J#CN!6rN!TQCM-crj!%-c-!!!!#!!!!!J!!!3(rN!L)!#)
+!L!!L!*Q3"2q3#QCQ-c2rrfCQ!!!!!3!H!!%!!!!-!!8!$crpT,ap'66h#54!![c
+lFNb(N6Qd!!B!!J!"!!)!!`!%!!8!"J!)!)X!!!$M!!!""!!!!E)!!!#C!!!"(!!
+!!-B!!!$M!!!""!!!!CB!!!#R!!!"XJ!!!,m!!!&'!!!!L`!!!6X!!!#C!!!"'`!
+!!*B!!!%E!*!)!J%!&3!!!!`!N!Err`#3"`%!N!8i!!!!SJ!!!%B!!!&+!!!F35"
+(FQ9KG&G[FQYc)(CPBh4[FL"NEf0eE@9ZG"A)!!!"!!!!"18!!!2P!!!!JNe03N*
+c49K8"J#3"J(q!!%!#`&069"#39"36!%!#'4bBAFa,QGh!!)!!J"D6d*+@N9#8J#
+3#J)!@Np#5PT&3P)!N"M2Y-fe!!!$k3!!"@G069"#39"36!8!N!B,$J)!J!X"68e
+33N&38%`'!*!'#`k#!3!,!8e08%*`BA9Xr`#3"JX2JJ%!#`&06e)b68p5-rd!N!B
+,*!)"!!X"68p5-Q&`EQhp!*!'#b8#!3!,!8e36P4"8&"-!3#3"JX"`J%!N!3D!!%
+"V`*9!#X!"3!V!!8"fJ*D!#X!"3(D!RS!!!"i!!m!!!")!%J!N!3#m!*!rr(rlJ-
+*!P*M!J8S!r`"!!!!!@J"D!#3"!k`#d!!!3%!!'3!!3!!!!%!!J!!!!%R$`!"!*!
+1%!#3#4!!rlArTJmY#jS!#!%!N!dC!3!!!`)!B2q3#+T9UP@U9DT9!*!)IrrrrrI
+rrrprrrIrIrrhrhIrrrphrrrrGrrIrhIrrIphrphrGrrGreArhIp9rphr9IrZreA
+rZrp9reAr9Ip9rhIGGpehhAIG9Ep9reAl9Ip9ZeAr9EY9re@r9Hj9qeAZ9EY9lP@
+l9Hj9ZeAU9EY9VP@k9DY9ZP@V9HT9UP@Z9DUU&DT9UP'U9DT&UP5U4DT8UN5U&DT
+%UP'U4+S4UN5U%DT!UK'U"+S4UN5U!+T%UJ#U3+S!UJ5U!)JLL#+))SJLUJ#U!+S
+!UJ#U!"%!UJ"%!+S!)J#U!#)!L!!L!)J!)J#)!#!!L!!#!)J!!!#)!!!!J!!)!)!
+!#!#!!!!!#!!!!)K%)K')4#)4%5*%L"%L4)L!3#!3#!3#!3%#"!J3)%#!i(!i(!i
+(Jm'$"`iF1($J`BK%)J#)4#)!%5*%!"%L4!##4#J3+%5#!CR-CM1Cc'BcGl[GlRH
+lhHlZhEYhlYflGhqrhqrhqrhqr[hlpqrI[hmIMmIMmIKm2[MaimH2(cjmGl[GrhH
+lhIrZhE[rlYflrhfleqrAZhhq-fE-Q60Qc*QUN!M-N!L)N!Mr!!!!r`!!!)#3#2m
+!N!F)J)!)#)#!#'B!!!#C!!!!riL)L2q)L)MrJ*!(r`$r!2m!r`$rr`!!rrm!!(H
+3#!$rrrm!rrrrIj!)!2q3"rGrIrIhIhrhQIrrrfErrrm!GhGh!(GhG`"rN!I`N!3
+2N!5CCQDCQ@CQQ3!)($jr2K`)!!J8+P8U&!La-!-Ef-!-MB!3!L!"#%!%#"3L3B!
+"!J5!`#%5$!3#!Iq!J)$r#!J)!(prI`$hprH!3#!!!J3)!)*%185#!3%"q(3L4im
+A)R'rS,qp[Id&r9@J3%"9#J3%L%3L%4%L4)L"3L3BJ8)N'+S!J!#)!)!!!i4)-!`
+#!3'!J%%q#!J8i`#3#bJ"!B!!!!!'GM%Z-#ia'P0jE@&ZG'9M)%GbC@&d9fpbDh-
+JGM%Z-#ia!!!!&446H@eKER4PBb"(FQ9KG&G[FQYcUJ!!!3!!!!6P!!!$j3!!!))
+!3l()'K3!!!!F!))!"&G38di!!!!U8&*19!!!!$C3393M!!!!3RCPFR-!!!"18e4
+5)!!!!&S!!Irr!*!&3l!S!!(rr`!!!"i!3kr8!!(rr`!!!*S!3l!i!!,rr`!!!k!
+!3l$d[r6rr`!!!m`!3krNa8-!:
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/indeterminate/GreatWorks_2.0.hqx b/writerperfect/qa/unit/data/draw/libmwaw/indeterminate/GreatWorks_2.0.hqx
new file mode 100644
index 000000000..c17e8ed95
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/indeterminate/GreatWorks_2.0.hqx
@@ -0,0 +1,104 @@
+(This file must be converted with BinHex 4.0)
+:#'4bBAFb,QGh!&T23NTD48*5!*!%"JN!!"#l2BS#!&T23NS!N!X"!!J!#3!!!!%
+!!!!"!!%!N!3#m!*!!*!%![!#3!#3"!,`!N!&+!2m!%J!5!"M!!%!N!3"!3!!!"!
+!!3!9!!!*5'9XGQ9dD@0K!*!%![!#3!#3"!,`!N!&+!2m!%J!5!"M!!%!!!!#!!!
+!!J!!!CbCN!6rr`&Zrj!'!@IrrfCQ-c-"E[rrCQB!!!(V!!(rN!J!!`#3#3%J(d5
+!28$rb%+R,`a)E[qU2c`J$URV5'lriNKZrkSr2!!%UHY)E!!#5'lrR$mm)!kTk`!
+!rqa)E[qF2c`!"+RV5'lrR!!#!!%!!3!!!!X!"3!12rf[S09lY$AK4d!#lGYUjad
+KGES"VJ%!!"8!!!!-!*!*!3!!"P!!!3!5!!!!@J!!!!B"!!"'!!N!!!!"!*!'!8J
+!!!+X!!!!&!!'!$B$!!!G!!!!B3!!!()!!!(#!!!!!J!!!!%!N"i"!!!i!!!!SJ!
+!!%B!!!&+!!!!!3!!!!)!!!"2!!!"D!!!!%CJP!#3%!8!!)N!!!"U!!!!e3!!!-i
+!!!!#!!!!!`#3(JJ!!)X!!!$M!!!""!!!!E)!!!!$!!!!"!!!!&)!N"S#!!"p!!!
+"EJ!!!+N!!!'+!!!!!J!!!!8!U3!!!@i!!!"p!!!"LJ!!!BS!N!`#!!"e!!!!aJ!
+!!)S!!!$Q!!!!!J!!!!B!LJ!!!-B!!!"e!!!!jJ!!!1B!N!d%!+S!!3!"!!!!!3!
+!!6B!N!B"(2q3"J%-!*!'!3,rN!B"(!!!rj!)!*!,!DRV!!!"m!"#R4`!4QeB!!%
+!!3!!"5J$r!")!%J!B`!"!!!!!3#3'JB&"3!!)!!"rrmZ!!!Jrj!%,J!!)2q3"#i
+!!#$rN!3Z!!!Jrj!%!!3!!J!!!!)!!!%JQC!%rrm")2q3"J%JrrpQCM-c!5$rrfC
+Q!!!")!!"rj!)!!-!N!N"!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!
+%,J!!)2q3"#i!!#!!!2rr,J#3$J%!!2rr!*!'!D!#4J#3&3%!!J!!!!)!!!%!QC!
+%rrm"!2q3"J%!rrpQCM-c!6crN!3c-`'m!!(rN!J!(iJ!)J#)!#)!!!%!'%+R5'`
+!"NKZrl`r2#!1UHY)E[rX5'lr[$mm!!5TkdKX!!K)E[qZ2c`J$URV5'lrpJ!!rki
+r2!!%UHY)E[qZ5'lr[!!"UHY)E[rB5'lr[$mm!!3"k`#3#2q3#J!!!!)!!!!#!!!
+"!*Q3"2rr!3$rN!B"!2rrCQBc-`%!rrpQCJ!!!@`!!Iq3#!!IL!!L!)J!)J!!!3!
+!!!`!3TdF!!!!!J!!!!`!3TdF!!!!!J!!!"3!3TdF!!S!N!P4!!!"m!"#!!!!4Qe
+B!!%!!3!!"5J$r!")!!%!B`!"!!!!!3#3$`%!N!X'!!)!!3!#!!-!"!!&!!B!!!!
+#!!J!L`!!!1-!!!%%!!!"XJ!!!*N!!!%F!!!!aJ!!!1-!!!%%!!!"PJ!!!+F!!!'
+b!!!![`!!!8B!!!#,!!!"1`!!!*N!!!%E!!!!PJ!!!4X!N!J#!3!9!!!!$!#3"[r
+r!*!(!3#3"6J!!!#L!!!!4J!!!8S!!"a")%GbC@&d9fpbDh-JGQ9MG'pb)'4[Bh9
+YC@jdGGJ!!!%!!!!2e3!!$Y8!!!$Q)%G%)%&38%`"!*!A#'4bBAFb,QGh!!)!!!"
+D6d*+@N9#8J#3$&T23NTD48*5!*!Bcl60iJ!!"JN!!"#l!*!-!TiP!8j238e"8&"
+-!3#3(3&1*3&6594P8dP86!8!N"d"db8"BA4MEdGkDA$r!*!B'J!"!Dm#93!V!!8
+!+`!&!GS#@J!V!!8"fJ*k!!!!H!!2!!!!5!")!*!%![!#32rarqi$#3*5B`)&+!2
+m!3!!!!&S!@J!N!31X!Y!!!%"!!"N!!%!!!!"!!)!!!!"*`m!!3#3$K!!N!N3!2q
+erkB2,3ZD!!J"!*!0'3%!!!-#!'$rN!LU9DT9UP@U93#3#(rrrrrhrrrrIrrhrhr
+rprphrrrrGrrrrhIrhrphrrhrGrrGrhIrhIp9rphr9IrGreArl[p9rl[r9Ip9reA
+r9IphhAIGGpehh9@r9Ip9qeAr9EY9re@l9Ip9[eAZ9IY9lP@l9Hj9ZeAZ9EY9kP@
+l9Dj9ZP@V9ET9UeAU9DT9VP@UUK@U9DT4UP@U4DT8UN@U9+T%UK@U4+T4UN5U%DT
+%UK'U3+S4UJ5U%DT%UJ#U4+S!UN#U!+S%UJ#))SJLL#+))US!UJ#U!+S!UJ!4!+S
+!4!#U!#)!UJ!L!)J!)J#)!#)!L!!J!)J!!J#)!!!!L!!!!)!!#!#!!!J!J!!!!!J
+!!!#)4#)4L%3L%4%L4)J4)N5)J%!J%!J%!J%"!J3)%#"!J1"`1"`1"i2"J`F1($K
+`i-')4#)!L%3L!"%L4!!4)N3!JN3S%#K%JJ'Cc'BcQFaQ-hHlhHjhZphZlYflGql
+GZhGr[pr[pr[pr[lpqrI[hlpr(ir(ir(iI$limH2(MamqI(HlhIphZphrlYflrql
+GZrppZpI[elYprM0Qc*NcCXbCUT!)c*!)L*!)r`!!!2m!!!#!N!Mr!*!(#)#!#!L
+!J!KQ!!!!Q3!!!2q)L)MrL)L)ri#3"rm!r`$r!2m!rrm!!2rr!!"hN!J!rrrr!2r
+rrhq3#!$rN!IhIhrhphprpjRrrrpQrrrr!(GhG`"hGhF!Ij!(m*!%$j!%Q@CQQCP
+QCTN!#"`qIciF#!!)&#T9+K3)X6!$'pM!$)f!%!)J!3K!"!J8)N'!!3)%J-!K%J`
+%!J(rJ)#!r`J)#!"rIhm!prIhJ%!J!!)%#!##4$P%JJ%"!IKd)NH2&b*a[k#r[Eh
+p"Ie9S%"!93S%")K%)K%4)N5)J8)N')&#*"LU!)!!L!#!!!1%5$!-!J%"J)""2JJ
+)&1-!N!S'C!!#!!MrN!Emr22c"3Arrf4N!J,Gh3J)"JEbmJJ)K)4'4J!!TD8!N!6
+8e!)#Uk[UkKmIYlF8&!!!C'34%9C@,#`&"C!!N!"aF6Sk`*!'J*!'3*!'!*!'rj!
++c-crN!5CQIq3"'CQrj!%-c2rN!3!!2rrc-crN!6-N!6rrmc-QCRrrmc-CQErrmc
+--c2rrmc-!!$rrjQCrj!%QCR-c2rrQC!%rrqCQ@CQrrqCQ6-crrqCQ3!!rrpQC[q
+3"'CQc-crrfCQQCRrrfD3"2rrCQBc-rrrCQB!!2rr-c2rN!3c-mc-rrmc-jQCrrm
+c-fCQrrmcN!6rrc-c!!$rr`!!rj!%!!$-c2rr!!#CQIrr!!"QC[rr!!!c-rrr!*!
+%c-crN!6-c2rrc*!%rrqCQFc-rrpQCXc-rrmc-mc-rrm!!-b3"2rrc*!+QCR-N!4
+QCXb3"$-cc*!%!!$-c*QCrrr-c*QCc*!%QC!%c-bCQ@CQc-bCQ6-cc-bCQ3!!c-a
+QC[rrc-aQCXb3"'CQQCR-c'D3"-c-CQBc-mc-CQB!!-c--c2rrmc--c2-N!3c-jQ
+Cc-`c-fCQc-`cN!6-c$-c!!$-c!!!rrr-c!!!c*!%!!#CQFc-!!"QCXc-!!!c-mc
+-!*!%QCRrN!5CQIrrc-bCQIrrQC!%rrpQCTQCrrmc-jQCrrm!!*QCc-crrjQCc*!
+%QCR-c*Q3"-c-CQDCQFc--c1CQFc-!!#CN!6rrjQ3"-c-QC!+CQDCN!3c-jQ3"!!
+!QCPQC[rrQCPQCXc-QCPQCTQ3"'D3"*QCCQBc-jQCCQB!!*QC-c2rrjQC-c2-c*Q
+C-c1CN!3c-fCQQCNcN!5CQ6-c!!#CQ3!!rrqCQ3!!c-bCQ3!!QC!%!!"QCTQC!!!
+c-jQC!*!%CQErN!4QC[rrc-aQC[rrQCPQC[rrCT!%rrmc-fCQrrm!!'CQc-crrfC
+Qc*!%CQE-c*QCCQE-c'D3"-c--c0QCXc-!!"QCTQCrrpQCTQCc-aQCTQ3"'CQQCP
+QN!5CQ6-cCQDCQ3!!CT!%rrpQN!6-c'D3"*QCCT!+-c0QN!3!!'CQ-c2rrfCQ-c2
+-c'CQ-c1CQ@CQ-c0QN!3cN!4QCM-c!!"QCJ!!rrpQCJ!!c-aQCJ!!QCPQCJ!!CT!
+%!!!c-fCQ!*!%-c2rN!3c-rrrc-`c-rrrQCNc-rrrCQBc-rrr-j!%rrm!!$-cc-c
+rrc-cc*!%-c2-c*QC-c2-c'CQ-c2-c$13"-c-!!!c-jQCrrmc-jQCc-`c-jQ3"$-
+cQCPQCM-cQCNcN!5CQ3!!-c0QC[rr-c0QCXc--c0QCTQC-c0QN!3c-fCQ-j!%CQB
+!!$13"2rr-j!%c-`cN!5CQ613"'CQ-j!+!!!c-`!!rrmc-`!!c-`c-`!!QCNc-`!
+!CQBc-`!!-j!%!*!'rj!%!!$rrmc-!!$rrjQC!!$rrfCQ!!$rrc-c!!$rr`#3"-c
+-rrm!!-b3"!!!c-bCQ3!!c-aQCJ!!c-`c-`!!c-`!N!5CQIrr!!#CQFc-!!#CN!3
+!!*QCCQB!!*QC-c-!!*QC!*!%CQErr`!!CQE-c!!!CQDCQ3!!CT!%!!"QCM-c!!"
+QCJ#3"$-crrm!!$-cc-`!!$-cQCN!!$-cCQB!!$13"!!!-c-!N!Err`#3"-c-!*!
+%QCN!N!4QCJ#3"$-clZi!N!6Gh3#3",Zl!*!%UUS!N!5)L!#3"(Gh!*!%998!N!4
+%4!#3"#)L!*!%%4%!N!EZlJ#3"0hG!*!%ZlX!N!5UUJ#3")L)!*!%GhF!N!4993#
+3"%4%!*!%)L)!N!34%3#3"ZlZ!*!%hGd!N!5lZ`#3"+UU!*!%L)J!N!4hG`#3"&9
+9!*!%4%3!N!3L)J#3""%4lT!'hC!'Zj!'UT!'L*!'Gj!'9C!'4*!')T!'%C!'!*!
+*"!#3"J%!!!(rN!B!N!N"rj!'!*!(,3!"rj!'!*!(@J!"rj!'!*!(K`!"rj!'!*!
+(Y!!"rj!'!*!(i3!"rj!'!*!'!3i!!Iq3"J#3"J%l!!2rN!B!N!N$!*!'rj!'!!!
+!![q3"J#3#3,rN!B!N!Hd!!(ZlJ#3")L)!*!(!3!!lZi!N!4993#3"3%!N!6rr`#
+3")L)!!!!!Iq3"-c-rj!%!*!'!I3!!J!*!!!!")!!N#%'T!!!i"Arr`!#!!N!!!!
+*!!$rr`!#kci!N!6J&rrr!!,Y`J#3"1!Brrm!!Zj0!*!&aIrr!!)!"!")!!!!")!
+!!!N!!!!%J!!!CIrr!!*8+`#3"@Err`!#9(-!N!9Srrm!!P8Y!!)!")!!!!5!!&@
+R!*!&Irrr!!*9X3#3"Ahrrm3#9EN!!)rN!!$rrm!#9KJ!!!!'!%J!!!!%J!!!#3!
+!!!5!!!!*!!!!")!!!-Irr`!#EqF!N!9Trrm!![##!*!&!J!5!!!!")!!N!4Vrrm
+!![$d!*!&EIrr!!,aQJ#3"1!!rrm!!P0X!*!&!3!'!")!!!!%J!!!!3!!!!5!!!!
+"!!!!")!!!!*6T`#3"2!!rrm!!`Nb!*!%m!(rr`!%!!N!!!!%J!!!!3!!!!5!!!!
+!m!Arr`!$#@-!N!6J(rrr)!-*I3#3"1!'rrmJ!`!'!!N!!!!%J!!!#3!!!!5!!!!
+"!!!!")!!N!AJ)[rr!!-+R3#3"1!%rrm!!`UY!!)!!3!!!!5!!!V$!*!%i!2rr`!
+$#Y-!N!6`"[rr!!-,*`#3"2!(rrm!!`ZN!*!%!B!!!3!!!!X!"3!12rf[S09lY$A
+K4d!#lGYUjadKGES"VJ!#!!!!#`!&!!irrDqJeAZd0H&(3!,YffVR(5&eZJ%d!!B
+!!!!,!!8!$MrpVk$9Hl3ei8G!!ZhEDZFG)A@k!Hi!"3!!!!X!"3!12rf[S09lY$A
+K4d!#lGYUjadKGES"!J!%!!!!#`!&!!irrDqJeAZd0H&(3!,YffVR(5&eZJ%!!!%
+!!!!,!!8!$MrpVk$9Hl3ei8G!!ZhEDZFG)A@k!1i!!J!!!!X!"3!12rf[S09lY$A
+K4d!#lGYUjadKGES!r!!'!!!!#`!&!!irrDqJeAZd0H&(3!,YffVR(5&eZJ!Z!!8
+!!!!,!!8!$MrpVk$9Hl3ei8G!!ZhEDZFG)A@k!2)!"!!!!!X!"3!12rf[S09lY$A
+K4d!#lGYUjadKGES!9J!$!!!!#`!&!!irrDqJeAZd0H&(3!,YffVR(5&eZJ!)!!-
+!!!!,!!3!%6rml+-)+"'F@54!!iZfb%KMc82P!&B!!!!S!J#!!!!$"RBb,M!Z-4T
+6H@eKER4PBb"(FQ9KG&G[FQYc)(Bb,M!Z-3!!!"888hPYB@jdC@-J4h*PBA4AEh*
+VFkS!!!%!!!!2e3!!$Y8!!!$Q!%CLD"S8!!!!(!$Q!!PA8&01!!!!8P"56P3!!!"
+H8%&8)`!!!'T3E&48!!!!GNji4@3!!!##4h*%8`!!!)j%B8K6!!!!QN&58R-!!!#
+QGQ9bF`!!!,*69&)J!!!![J!"rrm!N!9'ApJ!!Irr!!!!(J"'Aq`!!Irr!!!!QJ"
+'AhJ!!Irr!!!$S!"'Ah3!!Irr!!!+#!"'B#3!!Irr!!!+%!"'ArJ!!Irr!!!,&!"
+'Ap3!!Irr!!!0$!"'Am!!![rr!!!1N!!!4PrN[r6rr`!!$V`!4Pr3BkB!:
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/indeterminate/GreatWorks_P_1.0.hqx b/writerperfect/qa/unit/data/draw/libmwaw/indeterminate/GreatWorks_P_1.0.hqx
new file mode 100644
index 000000000..1eaa55c6c
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/indeterminate/GreatWorks_P_1.0.hqx
@@ -0,0 +1,98 @@
+(This file must be converted with BinHex 4.0)
+:#A"KD@jd-5jRG`"36P4(@N9#8J#3"!pJ!!!&Cbd)!*$r!*$r!!#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!2%!"a!(J!!#3K!"rJ!$"!)!32d!!!(G!2%!"a!)3!!#3K!"r3!
+#!J"!r3!!!Gd!m3!8%"!V-11L)aF6JX1%Xi0'$%9Q'&R!hJ$a!"-S%!a*%L8NQ54
+$*%6+"-N54CNNCGd!m3!6+"$SK$)95&&%!K$%LJK3S%843NAG!2%!%d33+2c5&8K
+4Ji)64)S)8+"&%Aj&h3$a!"0m%#L"%JL)88"#&%5+#&#J44&!4Gd!m3!6JJKS56)
+)K*%N3b6%LJ6*%Nd4*%AG!2%!&))(U$$*L)-4%i,$*)Q$4J`e%4K%`0i!k!!!!Y-
+!k!!!!Y-!k!!!!Y-!Z3#j!,N!Z3#j!2%!!3(!lJ!"!F$J!2%!!!AY!!%"81!!m3!
+"Hi$Y!!$li!$b!!%"9H`!!99!i3$b!!%Irq`!!Armi3$b!!&991`!!499i3$c!!!
+(k,m!X1)!m`!!"HK9!&$L!2-!!!(Sr`$!iJ$b!!%99H`!!998i3$b!!)$qi$Y!!(
+lm1%!m3!!9Hd!!3&9i!$a!!%I`1i!!3(mi!$a!!%"31i!!3&!i!$`!!!JlJ!!"pm
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3$a!!%99IJ!!"Ab93"8j3$b!!-$phGiq3!!1r,
+l!2MP!2)!"&GhGh9!qJ!!&I*9!&6P!2-!!3(hrRF!F2S!!$rbG`"mj3$c!!!%r3!
+!"2S!!"$b!!!8j3$c!!!hr(F!J2X!!$rbG`"mj3$c!2Yh!%$l!!!AmRF!G18!p!!
+!!rYh!(Ml!!!rmRF!I18!p!!!"2X!!!6l!!!3mJ!!&18!p!!!(rThq`!!2r*h!(M
+P!23!!"IkGrX!!"IbG`"dj3$d!2Ph!%$m!!!rmRF!I18!p3!!!IN!!"$m!!!3mJ!
+!&18!p3!!!rPh!(Mm!!!rmRF!I18!p3!!"IPh!(6m!!!AmRF!G18!p3!!$rPh!(E
+m!!!rmRF!I18!p3!!%2N!!!(m!!!3mJ!!&18!p3!!0rKh!)$p!!!rmRF!H18!p3!
+!9rKh!%$p!!!AmRF!G18!p3$hG`"!r3!!2r*h!(cP!1B!!"$b!!!8j3$f!!!"phF
+!F2d!!$rbG`"mj3$f!!!"phF!F2d!!"IbG`"dj3$f!!!$phF!H2d!!$rbG`"mj3$
+f!!!%p`!!"2d!!"$b!!!8j3$f!!!,phF!F[d!!$rbG`"ij3$f!!!(phF!G2d!!"I
+bG`"dj3$f!!!ApRIp!!!rmRF!I18!pJ!!%2F!!!(p!!!3mJ!!&18!pJ!!0rCh!)$
+q!!!rmRF!I18!pJ!!&rChr3!!&r*h!(6P!2B!pAF!32i!!$rbG`"mj3$f!!"!pJ!
+!32i!!"$b!!!8j3$f!29h!%$q!!!rmRF!H18!pJ$eG`"!rJ!!&r*h!(6P!2B!!2I
+fG`"JrJ!!2r*h!(cP!2F!!!(e!!!3rJ!!%2)!!"6P!2F!!!(eG`"`rJ!!2r*h!(c
+P!2F!!!(eG`"`rJ!!&r*h!(6P!2F!!!(eG`"`rJ!!2r*h!(cP!1B!!"$b!!!8j3$
+h!!!$pAF!H2i!!$rbG`"ij3$h!!!"pAF!F2i!!"IbG`"dj3$h!!!$pAF!H2i!!$r
+bG`"mj3$Q!!!3mJ!!&18!p`!!"r9h!(6q!!!rmRF!I18!p`!!"r9h!(6q!!!AmRF
+!G18!p`!!"r9h!(6q!!!rmRF!I18!p`!!"28!!!6q!!!3mJ!!&18!p`!!!r9h!($
+q!!!rmRF!H18!p`!!"r9h!(6q!!!AmRF!G18!p`!!"r9h!(6q!!!rmRF!I18!p`!
+!"28!!!6q!!!3mJ!!&18!p`!!"r9h!(6q!!!rmRF!I18!p`!!"r9h!(6q!!!AmRF
+!G18!p`!!"r9h!(6q!!!rmRF!I18!p`!!"28!!!6q!!!3mJ!!&18!p`!!!r9h!($
+q!!!rmRF!H18!p`!!"r9h!(6q!!!AmRF!G18!p`!!"r9h!(6q!!!rmRF!I18!jJ!
+!%2)!!"6P!2F!!!2eG`"irJ!!2r*h!(cP!2F!!!(eG`"`rJ!!&r*h!(6P!2F!!!2
+eG`"irJ!!2r*h!(cP!1B!!"$b!!!8j3$h!!!"pAF!F2i!!$rbG`"ij3$h!!!"pAF
+!F2i!!"IbG`"dj3$h!!!"pAF!F2i!!$rbG`"mj3$h!!!"p3!!%2i!!"$b!!!8j3$
+f!!$hpRF!B2i!!$rbG`"mj3$f!29h!%$q!!!AmRF!G18!pJ$eG`"!rJ!!2r*h!(c
+P!2B!!%$f!!"!rJ!!%2)!!"6P!2B!pAF!32i!!$rbG`"ij3$f!!!ApRIp!!!AmRF
+!G18!pJ!!0rCh!)$q!!!rmRF!I18!pJ!!%2F!!!(p!!!3mJ!!&18!pJ!!&rChr3!
+!2r*h!(cP!2B!!!IhG`"dr3!!&r*h!(6P!2B!!!rhG`"fr3!!2r*h!(cP!2B!!!6
+h!!!%r3!!%2)!!"6P!2B!!!2hG`"ir3!!2r*h!(MP!2B!!!(hG`"`r3!!&r*h!(6
+P!2B!!!(hG`"`r3!!2r*h!(cP!1B!!"$b!!!8j3$e!!!hq(Im!!!rmRF!I18!p3!
+!9rKh!%$p!!!AmRF!G18!p3!!0rKh!)$p!!!rmRF!I18!p3!!%2N!!!(m!!!3mJ!
+!&18!p3!!#rPh!(,m!!!rmRF!H18!p3!!"IPh!(6m!!!AmRF!G18!p3!!!rPh!(M
+m!!!rmRF!I18!p3!!!IN!!"$m!!!3mJ!!&18!p!!!0rThq`!!2r*h!(cP!23!!"I
+kGrX!!"IbG`"dj3$d!!!IqRIl!!!rmRF!I18!p!!!"2X!!!6l!!!3mJ!!&18!p!!
+!!rYh!(Ml!!!rmRF!H18!m`$lG`"!q`!!&r*h!(6P!2-!!$ImG`#!q`!!2r*h!(c
+P!2-!!!6p!!!%qJ!!%2)!!"6P!2-!!3'hrRF!-2S!!$rbG`"mj3$b!!4AGhGe32S
+!!"IbG`"dj3$b!!-(phGmq3!!2r*h!(cP!2%!!499q!!!%2)!!"6P!1B!!$rbG`"
+ij3$Q!!!AmRF!G18!jJ!!2r,r!2cP!1B!!"Ab93"8j3$Q!!!rmVm![18!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!LY-!!!%!!!!%j3!!!q8!!!##6%p54&G"8P-%!*!A#A"KD@jd-5jRG`)
+!!J"36P4(@N9#8J#3#J)!8%j84eT&3P)!N"M2Y-d4!!!2B!!!"@F!N!`#"L8"690
+09%&38%`"!*!G!SiP!8e958e"8&"-!3#3(3+K*3&1590*3dp%-!-!N"JD!!%"V`*
+9!#X!"3!V!!8"fJ*D!#X!"3(D!RS!!!"i!!m!!!")!%J!N!3#m!*!rr(rlJ-*!P*
+M!J8S!r`"!!!!!@J"D!#3"!k`#d!!!3%!!'3!!3!!!!%!!J!!!!%R$`!"!*!1%!#
+3#4!!rlArTJmY#jS!#!%!N!dC!3!!!`)!B2q3#+T9UP@U9DT9!*!)IrrrrrIrrrp
+rrrIrIrrhrhIrrrphrrrrGrrIrhIrrIphrphrGrrGreArhIp9rphr9IrZreArZrp
+9reAr9Ip9rhIGGpehhAIG9Ep9reAl9Ip9ZeAr9EY9re@r9Hj9qeAZ9EY9lP@l9Hj
+9ZeAU9EY9VP@k9DY9ZP@V9HT9UP@Z9DUU&DT9UP'U9DT&UP5U4DT8UN5U&DT%UP'
+U4+S4UN5U%DT!UK'U"+S4UN5U!+T%UJ#U3+S!UJ5U!)JLL#+))SJLUJ#U!+S!UJ#
+U!"%!UJ"%!+S!)J#U!#)!L!!L!)J!)J#)!#!!L!!#!)J!!!#)!!!!J!!)!)!!#!#
+!!!!!#!!!!)K%)K')4#)4%5*%L"%L4)L!3#!3#!3#!3%#"!J3)%#!i(!i(!i(Jm'
+$"`iF1($J`BK%)J#)4#)!%5*%!"%L4!##4#J3+%5#!CR-CM1Cc'BcGl[GlRHlhHl
+ZhEYhlYflGhqrhqrhqrhqr[hlpqrI[hmIMmIMmIKm2[MaimH2(cjmGl[GrhHlhIr
+ZhE[rlYflrhfleqrAZhhq-fE-Q60Qc*QUN!M-N!L)N!Mr!!!!r`!!!)#3#2m!N!F
+)J)!)#)#!#'B!!!#C!!!!riL)L2q)L)MrJ*!(r`$r!2m!r`$rr`!!rrm!!(H3#!$
+rrrm!rrrrIj!)!2q3"rGrIrIhIhrhQIrrrfErrrm!GhGh!(GhG`"rN!I`N!32N!5
+CCQDCQ@CQQ3!)($jr2K`)!!J8+P8U&!La-!-Ef-!-MB!3!L!"#%!%#"3L3B!"!J5
+!`#%5$!3#!Iq!J)$r#!J)!(prI`$hprH!3#!!!J3)!)*%185#!3%"q(3L4imA)R'
+rS,qp[Id&r9@J3%"9#J3%L%3L%4%L4)L"3L3BJ8)N'+S!J!#)!)!!!i4)-!`#!3'
+!J%%q#!J8i`#3#bJ"!B!!!!!'GM%Z-#ia'P0jE@&ZG'9M)%GbC@&d9fpbDh-JGM%
+Z-#ia!!!!&446H@eKER4PBb"(FQ9KG&G[FQYcUJ!!!3!!!!6P!!!$j3!!!))!3l(
+)'K3!!!!F!))!"&G38di!!!!U8&*19!!!!$C3393M!!!!3RCPFR-!!!"18e45)!!
+!!&S!!Irr!*!&3l$i!!(rr`!!!"i!3l"3!!(rr`!!!*S!3kr%!!,rr`!!!k!!3kr
+d[r6rr`!!!m`!3l"i!,-!:
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/BeagleWorks_1.0.hqx b/writerperfect/qa/unit/data/draw/libmwaw/pass/BeagleWorks_1.0.hqx
new file mode 100644
index 000000000..c1942aed5
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/BeagleWorks_1.0.hqx
@@ -0,0 +1,104 @@
+(This file must be converted with BinHex 4.0)
+:#'4bBAFa,Q*h!%*AC(*#9fYc!*!%&$J!!!&L)1*#9fYc3PGNFN*AC()!N!8"!*!
+(!3#3"J%(!*!%")m!#3!!!!N!N!`"!*!%"`!"!!m!!!")!%J!N!3#m!*!rr(rlJ-
+*!P*M!J8S!r`"!!!!!@J"D!#3"!k`#d!!!3%!!'3!!3!!!!%!!J!!!!%R$`!"!*!
+1%!#3#4!!rlArTJmY#jS!#!%!N!dC!3!!!3F!N!J""`#31!C(C@jPGQ%!!!!%!!B
+!!"&%!!!!F!!!"DJ!!!r-!!B!!"'m!!!6$!!!!!)!N!3#fJ)SJ!%!!3!*!!!!#3!
+!!!%!N!8)!!%!!!!"!!!!!J!"!%N!!!!N!*!&'3!C!!!!$!#3"5%!!2rr!*!*J!#
+!!)3!"J#!!!S!!!8S!*!@rj!)!!!J8)L3"!8#!*!%(#)L)K`!!!"9S%"!93S%"!!
+!ULVU#[S#rJ!!!,m![lq`N!3!!+pIVem0#`d,!!"hLBq2GjMiq!!!`fBmCX0Q2'B
+!!!JU&'-8+JL!!!!!3&aFA%"q!!!!#"`qIrIM`B!!!!!3%2jm1'a%!!!!($jrIhm
+q(!!!J%!J!!)%#!!!!!%"%"!"!4!3!!!4)N3!%5*%!!!!99@UUP99UUS!!,%`!a[
+B`!b0!!#)4#)4%5*%L!!!J)""2JJ)&1-!!+S!J!#)!)!!!!!3N!8SaLJ!!!JF)X'
+!!3)%!!!)&#*"J!%#"!!!ri#!J2m)#!J!!2Kd)NH2&b*a!!#U[k#rU[X+q`!!m*!
+%$j!%!!!!#"`qIciF#!!!3+!!!!3+!*!%c!!!!$-!N!9%)J#)4#)!L!!!c$2--m`
+cc$-!!)!3!L!"#%!%!!#"3L3BJ8)N'!!!!i4)-!`#!3%!!)J8)N')!+S!!!##4$P
+%JJ%"!3!!%#"8U[m#"!J!!)$!)4)-"!)"!!!!Ihpr!2Ihp`!!m(JN3SF2%L%!!,q
+J[lfpr3Ap!!#CCQDCQ@CQQ3!!!!J8+P8U&!J!!)!!!!!)!*!&J!!)!)!!#!!!!)J
+!)J#)!#)!!!#U!"%!UJ"%!!!!L#+))SJLL#)!!+T%UJ#U4+S!!!#U4+S4UN5U%3!
+!UN@U9+T&UP3!!+T9UP@U9DT9!!"9ZP@V9ET9U`!!9EY9lP@l9Hi!!&@l9Ip9ZeA
+r!!"hhAIGGpehh3!!9IrZreArZrm!!(IrhIphrphr!!"rrrIrIrrhr`!!L!!!!)J
+!N!@)!#!!L!!#!!!!UJ!L!+S!)J!!!+S!UJ#U!+S!!!#U3+S!UJ5U!!!!UN#U%DS
+%UK%!!+T%UK@U4+T4!!#U&DT9UP'U93!!9HT9UP@Z9DS!!&@l9HT9Ze@Z!!"9[eA
+Z9IY9lJ!!9Ep9reAl9Im!!&Ar9Ip9reAr!!"9rphr9IrGr`!!GrrrrhIrrrm!!(r
+rrrrhrrrr!!#UN!J!!-b3#!!!L*!)!!#!N!J!!2m!!!$r!*!&r`#3#Iq)L)MrL)L
+)!!$rJ*!(!!!4)N5)%5*%L!!!L%3L%BK%)K%!!)-($K`iF1$"!!$JF$JF$JH$`3!
+!!3)%#"!J3)!!!)"!)"!)"!)"!!##4#J3+%5#!3!!J8)N'"JN3S%!!!$r!2m!r`$
+r!!$rr`!!rrm!N!4hN!J!!(q3#!!!!2rrr`$rrrm!!!$rN!F!!!"hGhF!GhGh!!!
+!Ij!(!!$ZhEYhlYflG`!!Gl[GlRHlhHi!!$0Qc*NcCXbC!!#Cc'BcQFaQ-`!!r[h
+lpqrI[hm!!(qrhqrhqrhq!!"pZpI[elYprJ!!IVhEjqIE[Ai!N+$rIb"S!!JJ8#)
+!rhi!1%K"`[`!12pp3N(3J6!`##i!!%je6PB!!#"Z!3!"!!%#!!B"!!!+!!!+&!!
+!!"lrN!B!!!!K!*!*4Icmmr-&"3!!!)RbmJJ)K)3!!!$0hGd)#!B'!!!"%3)#Uk[
+UkJ!!!98!!)#!%4%!!!'C!*!%e03!!!!HhC!'!!!!(Xb3"J!!!"klN!B!!!!HUT!
+'!!!!(SL3"J!!!#&QN!B!!!!K4*!'!!!!)5+3"J!!!#%!N!NK6-`1%`#3"5&-c"`
+R!*!&)8c-+M`!N!8K6-`i8!#3"5&-c%CP!*!%!99&)%c-!*!%!98h#dc-!*!%!98
+Sq%c-!*!%!98DiNc-!*!%!98-cdc-!*!%!98!!%c-!8J!!!&9!!"-c!pE!!!"93!
+!6-`GF!!!!98!!%c-+i3!!!&9!!"-c$QC!!!!cB8H)hd!N!A0K4iBCJ#3"Ff&(M$
+-!*!&cB8H568!N!A0K4jKR!#3"Ff&(RS&!*!%!99hdS8H!*!%!99IDB8H!*!%!99
+(!i8H!*!%!98ZQS8H!*!%!98@-i8H!*!%!98!!)8H!MJ!!!&9!!#&(KUH!!!"93!
+!K4ic"`!!!98!!)8H5fd!!!&9!!#&(Q2A!!!!cEe`-S%!N!A0[A!LZ3#3"FfpF%9
+b!*!&cEe`D#m!N!9&[A#+j`#3"8@pF+fP!*!&4DU%[A!!N!9&KmHpF!#3"!&9C3k
+pF!#3"!&93P'pF!#3"!&9(jLpF!#3"!&9!!#pF!-S!!!"93!![A!Pi3!!!98!!,e
+`5*i!!!&9!!#pF'YA!!!"%3!![A#1&!!!!-he`N'&!*!&cIA#,3X!N!A0pF*D&`#
+3"8Ae`SFS!*!&4IA#Y$-!N!9&pF,K43#3"8AG0[A#!*!&4E!PpF)!N!9&JaRe`J#
+3"!&99JMe`J#3"!&9+2he`J#3"!&9!!$e`J3B!!!"93!!pF)a*!!!!98!!2A#AM8
+!!!%4!!$e`SY!!!!"%3!!pF+i8J!!!-hrrfB,,K3!!!$0rrp8MLi8!!!!cIrrH`J
+Z&!!!!%Arrk'(,K3!!!"&rrr)!5i8!!!!4IrrlRmZ&!!!!%AV#2rr,K3!!!"&a)R
+rrbi8!!!!4Ci2rrmZ&!!!!99hNIrr,K3!!!&984Irrbi8!!!"95i8rrmaN`!!!98
+Z&2rr@!d!!!%4,K6rrhk-!!!"%5i8rrqP"J!!!4%Z&2rrbi8!!!"&rrq2@@CQ!!!
+!4IrrJSeQCJ!!!%ArrjkeCQB!!!"&rrqkhfCQ!!!!4Irre`GQCJ!!!%Arrr-bCQB
+!!!"&m+MrrfCQ!!!!4G4prrpQCJ!!!%@i9[rrCQB!!!"&R#[rrfCQ!!!!4B!%rrp
+QCJ!!!99QC[rrD28!!!%4CQErri8F!!!"%@CQrrqK4`!!!4&QC[rr[@m!!!%4CQE
+rrpQD!!!!([rrZ+HHZ!!!!"lrrl#0RVJ!!!!Hrrr#BCki!!!!([rre$LHZ!!!!"l
+rrqB0RVJ!!!!Hrrrhj*ki!!!!([C)rrqHZ!!!!"lNF[rrRVJ!!!!HdThrrjki!!!
+!(X$'rrqHZ!!!!"kZmIrrRVJ!!!!HRVMrrk"A!!!!(Tkirrqb,!!!!"kHZ2rra!)
+!!!!HRVMrrpAA!!!!(TkirrrRVJ!!!"lrrq(fe`S!!!!HrrrHM0F+!!!!([rrjJl
+A#J!!!"lrrqf4e`S!!!!Hrrre%pF+!!!!([rrr*EA#J!!!"llkIrre`S!!!!Hp'E
+rrpF+!!!!(ZcNrrrA#J!!!"lPBIrre`S!!!!HhGrrrpF+!!!!(YF+rrrAZ3!!!"l
+A#[rrhcX!!!!He`VrrqDq!!!!(YF+rrrZ3!!!!"lA#[rrpF-!!!!He`VrN!3!!!!
+He`ViI[rr!!!!(YF+m2crr`!!!"lA#ZPjrrm!!!!He`VKprrr!!!!(YF+fR6rr`!
+!!"lE)GF+rrm!!!!HiU6A#[rr!!!!(ZSQe`Vrr`!!!"laUGF+rrm!!!!Hq5[A#[r
+r!!!!([rre`Vr83!!!"lrrpF+pmm!!!!HrrrA#["-!!!!([rre`VSbJ!!!"lrrpF
++i8J!!!!HRVMrrrrq!!!!(TkilL[rr`!!!"kHZ0aArrm!!!!HRVM+J2rr!!!!(Tk
+iZ+[rr`!!!"kHZ+E8rrm!!!!HU(#HZ2rr!!!!(VT'RVMrr`!!!"l-'jkirrm!!!!
+HhI+HZ2rr!!!!(Zr(RVMrr`!!!"lrrjkirQ%!!!!HrrqHZ1b-!!!!([rrRVMDYJ!
+!!"lrrjkib1%!!!!HrrqHZ,F+!!!"%@CQrrrrrJ!!!4&QCZ2Crrm!!!%4CQE(XIr
+r!!!"%@CQUiIrr`!!!4&QCSpIrrm!!!%4CQCc02rr!!!"%A@qCQErr`!!!)Q4k@C
+Qrrm!!!#*VK"QC[rr!!!!LFSlCQErr`!!!)RQBQCQrrm!!!#*rrpQC[ea!!!!LIr
+rCQEK5J!!!)RrrfCQa4m!!!#*rrpQCUMh!!!!LIrrCQD-c3!!!4%Z&2rrrrd!!!%
+4,K6CK[rr!!!"%5i8X`crr`!!!4%Z&)b0rrm!!!%4,K4Q%rrr!!!"Q5i82jArr`!
+!!CP$$#i8rrm!!!'CDBXZ&2rr!!!!LC!!"5i8rrm!!!#*YS-Z&2rr!!!!LGcp,K6
+rr`!!!)Rrrbi8r)%!!!#*rrmZ&0B(!!!!LIrr,K5[L!!!!)Rrrbi8L3i!!!#*rrm
+Z&'+2!!!"%3!!pF,e[J!!!4%!!-LhpF)!!!%4!!#EUrA#!!!"%3!!ETVe`J!!!CN
+!!%'2pF)!!!'C!!!8IIA#!!!"Q4L-!!$e`J!!!CP&R3!!pF)!!!'CFUN!!2A#!!!
+!LCqk!!$e`J!!!)R-a3!!pF)!!!#*pF)!!2'U!!!!LIA#!!$%RJ!!!)Re`J!!Pid
+!!!#*pF)!!'U#!!!!cIA#!!!pF3!!!4%!!,e`[@d!!!%4!!#DYle`!!!"%3!!Grk
+pF!!!!CN!!&9"[A!!!!'C!!!bLEe`!!!"Q3!!$mZpF!!!!CN5l!!![A!!!!'C0DN
+!!,e`!!!"Q9KL!!#pF!!!!)Pl(`!![A!!!!#*RGJ!!,e`!!!!LEe`!!#k5!!!!)Q
+pF!!!Pim!!!#*[A!!!(65!!!!LEe`!!"5'3!!!-fpF!!!,e`!!!%4!!#&(S8F!!!
+"%3!!E,L&(J!!!CN!!&45K4i!!!'C!!!lkB8H!!!"Q3!!)i+&(J!!!CN!!!XCK4i
+!!!'C$8`!!)8H!!!"Q5@e!!#&(J!!!CNq'`!!K4i!!!'C9S3!!)8H!!!"Q@lV!!#
+&(J!!!)Q&(J!!JZB!!!$0K4i!!'U!!!!!cB8H!!"5&`!!!-f&(J!!1E%!!!$0K4i
+!!#&)r[rrr#"3)8X!"J!!'-Mrk%jH6R8!!J!#!!B!"J!#!$`!!!&S!*!)rrd!!!!
+-!!!!"!#3#``!!!!%!!!!$!#3"``!!2rp!*!0!3#3"2rb!!!!$J!!!!i!!!#GJ!!
+!,3#3"`)!N"Vrr8c-+M`!!!!66-`i8!!!!"4-c%CP!!!!&88J6-`!!!!@0`Y-c!!
+!!"FSq%c-!!!!'"VL6-`!!!!C$-rrr!!!!"S!!%c-!8J!'`!!6-`2@`!F!!"-c"e
+`!"d!!%c-+i3!(J!!6-`jQ3!IK4iMI3!!!##&(KKQ!!$rqi8H--`!!!!LK4j*03!
+!!#1&(Q'F!!!!*)8HHJ8!!!!PGp+&(J!!!#CIDB8H!!!!*dF$K4i!!!!S,TS!N!8
+T&M1&(J!!!#S!!)8H!MJ!+`!!K4iDRJ!X!!#&(M-(!#d!!)8H5fd!,J!!K4jMe`!
+[[A!bJ3#3""!"!"'!!!"3J!!!Bi!!!9q!!!!"%!F!0J!!!(8!!!"+!!!"(J!!!!)
+3!3#'J!!!2S!!!1'!!!$BJ!!!!a!#!)D!!!%0J!!!mi!!!B1!!!!%%!-!BB!!!'S
+!!!#)J!!!NJ!!!!83!`"KJ!!"*`!!!)L!!!&2!!!!!3#3"3J!!3!!!!%!!!!#!!%
+!53!!!$F!5J!!!"N!'3!!!!`!N!Mrr`#3#3F!N!8)!!%!!!!"!!!!!J!!!%N!!!!
+*!*!&'3!C!!!!$!#3"5%!!2rr!!!!$!#3"3%!N!8)!!%!!!!"!!!!!J!A!%N!!!"
+#!0N!!!!C!"N!!!!-!*!)rrm!N!N#!*!&#!!"!!!!!3!!!!)!1`"*!!!!*!"P!!!
+!'3!C!!!!$!#3#2rr!*!*!`!!!!%!#!!$!!!!"!!!!!)!!3"*!!!!*!#3"4N!'3#
+3$2rr!*!*!`!!!"%!#!!$!!!!"!!!!!)!!3"*!!!!*!#3"4N!'3!"!*!+rrm!N!N
+"!"N!%!"4!!!!'8%J3Q9KCfaP9fpbDh-RFb"NFQ&h)'CTE'@Sp!!!!3!!!!%F!!!
+!(!!!!%DUd1N!##m))'lrr#"S!+SLD!!-6T&`!&"2B!*`!(!!,`SUC(*KGc%ZBRF
+`!!)!!!"#9f4b3PGVF`#3#N*AC(*#9fYc!*!Bcl69jJ#3"J&L!!#-SaiS5#!-CaJ
+[$%kkq`JS3#Pm!!!!dJ"q'A`!!3#'@%mJ$#KZrra1ANje!!!5GJr`!#C19J!!51F
+!'#CZ!"`SEJ!),`X[,J!B-#i!&NM!,`!`,J!55-![!#mZ!!`[$%kY$QSJ5b*V!!V
+3k3#B,`JJ55*S!*a1N6P!!$"-lKJ!r`!!!!J!6J!#!G`#GJ!!!!`,3Q9KCfaP9fp
+bDh-!!!%!!!!"(!!!!"`!!!"'!$Zja"XZ!!!!(!"'!!&h8'pc!!!!%P088L!!!!!
+H!qRrr`#3#,rdrrm!!!!-!*!%`G-!:
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/BeagleWorks_P_1.0.hqx b/writerperfect/qa/unit/data/draw/libmwaw/pass/BeagleWorks_P_1.0.hqx
new file mode 100644
index 000000000..6d640c8a5
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/BeagleWorks_P_1.0.hqx
@@ -0,0 +1,427 @@
+(This file must be converted with BinHex 4.0)
+:#A"KD@jd-5jLG`"#9h"d3PGVF`#3"%pE!!!"BN'h3PGVFd*AF(4#9h"d!*!&!3#
+3"`%!N!B""`#3"!3-!!N!!!!*!*!-!3#3"!F!!3!2!!!!5!")!*!%![!#32rarqi
+$#3*5B`)&+!2m!3!!!!&S!@J!N!31X!Y!!!%"!!"N!!%!!!!"!!)!!!!"*`m!!3#
+3$K!!N!N3!2qerkB2,3ZD!!J"!*!0'3%!!!%(!*!)!3F!N$J'4f9ZCACK!!"',J!
+!#!J"D!*!!!J!N"Ir!!$rN!B!!Icmmr-&"3!#m[))#)5%!!2Gh3J)"JB!"!)#Uk[
+UkJ!&!!#!J"%4!!B!N!68e!!(hC!'!!M-N!B!#EZ3"J!+UT!'!!Z)N!B!$'D3"J!
+04*!'!!iLN!B!$`#3"a"-c!i6!!!!%8c-(#F!!!!56-`U2!!!!"0-c$K3!!!!&%c
+-4Q8!!!!945"-c!!!!"Bh#dc-!!!!&bMi6-`!!!!B'Z*-c!!!!"N-cdc-!!!!'J!
+!6-`"5!!E!!"-c!pE!"`!!%c-(A!!(3!!6-`VK!!H!!"-c$QC!"q&(L0p!!!!))8
+H''B!!!!KK4i`c!!!!#+&(NNe!!!!)i8HBC`!!!!NK4jk"3!!!#9hdS8H!!!!*Pp
+TK4i!!!!R4`1&(J!!!#JZQS8H!!!!+4BcK4i!!!!U!!#&(J)i!#X!!)8H'Ti!,!!
+!K4ic"`!Y!!#&(NYY!#i!!)8HBpF!,le`-S%!!!!`[A!LZ3!!!$'pF%9b!!!!-Ve
+`D#m!!!!c[A#+j`!!!$5pF+fP!!!!0DU%[A!!!!!fKmHpF!!!!$GP$Ve`!!!!1%*
+4[A!!!!!j(jLpF!!!!$S!!,e`!bJ!1`!![A!Pi3!m!!#pF%LH!$d!!,e`DeF!2J!
+![A#1&!!rpF*"K3!!!%$e`Ld,!!!!3IA#@KF!!!"#pF+(+!!!!%2e`V3c!!!!42A
+#i88!!!"&h6Ee`J!!!%D`*IA#!!!!4i-CpF)!!!")9JMe`J!!!%NSrIA#!!!!5J!
+!pF)%'!",!!$e`M%N!%`!!2A#AM8!63!!pF+,3!"1!!$e`VK5!%rrrfB,,K3!82r
+r9)iZ&!"4rrpl##i8!&,rrk'(,K3!8rrrb!%Z&!"8rrrZIbi8!&AV#2rr,K3!9X5
+*rrmZ&!"ARJrrrbi8!&KhNIrr,K3!@9%ArrmZ&!"D,K6rrc'6!&XZ&2rr@!d!A#i
+8rrpqM!"G,K6rrk8'!&iZ&2rrbi8!ArrrMePQCJ"Jrrq#M@CQ!'(rrjkeCQB!B[r
+rZYpQCJ"MrrrA"fCQ!'6rrr-bCQB!CI#SrrpQCJ"Qe(hrrfCQ!'Hi9[rrCQB!D*`
+VrrpQCJ"TJ!6rrfCQ!'TQC[rrD28!DfCQrrq&(!"XCQErrk&(!'eQC[rr[@m!EQC
+QrrrCQJ"[rrqiTjki!($rrl#0RVJ!FIrr`Q'HZ!"brrr81*ki!(2rrqB0RVJ!G2r
+rpq5HZ!"epNMrrjki!(ENF[rrRVJ!Gp+GrrqHZ!"i`-Errjki!(QZmIrrRVJ!HTk
+irrqJ9`"lRVMrrl)X!(bHZ2rra!)!ICkirrr9e`"qRVMrrqHZ!(rrrq(fe`S!J2r
+rhScA#J#"rrrQ$YF+!),rrqf4e`S!Jrrrp42A#J#%rrrmPYF+!)AlkIrre`S!K[4
+QrrrA#J#(l16rrpF+!)MPBIrre`S!LGhIrrrA#J#+e`VrrpHj!)[A#[rrhcX!M0F
++rrrQ[J#0e`Vrrqj!!)lA#[rrpF-!MpF+rj!%!*!!e`ViI[rr!*(A#[$mrrm!NYF
++kARrr`#6e`VKprrr!*6A#YTdrrm!PGXKe`Vrr`#@iU6A#[rr!*IU*YF+rrm!Q2'
+Te`Vrr`#Cq5[A#[rr!*VrrpF+re%!Qrrre`Vhc`#FrrrA#["-!*hrrpF+k-S!R[r
+re`VK5!#IRVMrrrrq!+#HZ1iVrrm!SCkih&Irr`#LRVM+J2rr!+1HZ,LVrrm!T*k
+iTY6rr`#PU(#HZ2rr!+Dk4Tkirrm!Tm`ERVMrr`#ShI+HZ2rr!+R[ajkirrm!U[r
+rRVMqB3#VrrqHZ1b-!+crrjkifVB!VIrrRVM)i3#ZrrqHZ,F+!+pQC[rrrri!X'C
+QipRrr`#aCQE(XIrr!,*QCUZ(rrm!XfCQMerrr`#dCQCc02rr!,9e[QCQrrm!YT(
+TCQErr`#hVK"QC[rr!,M+1fCQrrm!ZHCLCQErr`#krrpQC[ea!,[rrfCQi8S![2r
+rCQE&(`#prrpQCUMh!,lrrfCQM-d![bi8rrrrr3$!,K6CK[rr!-%Z&,--rrm!`Li
+8M)hrr`$$,K4Q%rrr!-3Z&$q9rrm!a8--,K6rr`$'DBXZ&2rr!-H3!!8Z&2rr!-L
+fJbi8rrm!bGcp,K6rr`$+rrmZ&2b"!-[rrbi8eJF!c2rr,K5[L!$0rrmZ&)N1!-l
+rrbi8BSm!c`!!pF,e[J$3!!$)YrA#!0%!!*ZVpF)!dJ!!ETVe`J$6!!""MrA#!03
+!!"4ppF)!e4L-!!$e`J$@4Cd!!2A#!0GbU3!!pF)!f*qk!!$e`J$Cc-8!!2A#!0V
+e`J!!mDS!frA#!!$%RJ$FpF)!!*H0!0he`J!!DS)!h[A#!!!pF3$I!!#pF,eY!1!
+!!*Uh[A!!i3!!GrkpF!$L!!"93Ee`!1-!!$+*[A!!j!!!$mZpF!$P%Z`!!,e`!1B
+eU3!![A!!jeKL!!#pF!$SHam!!,e`!1QGf!!![A!!kVe`!!#k5!$V[A!!!*H2!1b
+pF!!!G0)!lEe`!!"5'3$Z[A!!!#pF!1m!!)8HK4`!m!!!E,L&(J$a!!"88S8H!2)
+!!$[TK4i!m`!!)i+&(J$d!!!,'B8H!2806!!!K4i!pL@e!!#&(J$h2KX!!)8H!2K
+@K!!!K4i!q@lV!!#&(J$kK4i!!),Q!2Z&(J!!DS!!r)8H!!"5&`$pK4i!!$Qa!2k
+&(J!!)8J!r`#3"NBZ!*!%!@J#3!!4![m-!2q3"!#3#!*!!!!"D!#3"k!!JJ!"!!S
+!N!3"D!*!!*L#3!#3"!&S!N!!N!P)!!!!5!#3"3J!!3!)!*!&1l8`!*!'%PN!!!$
+r!!$rN!B!!Icmmr-&"3!#m[))#)5%!!2Gh3J)"JB!"!)#Uk[UkJ!&!!#!J"%4!!B
+!N!68e!!(hC!'!!M-N!B!#EZ3"J!+UT!'!!Z)N!B!$'D3"J!04*!'!!iLN!B!$`#
+3"a"-c!i6!!!!%8c-(#F!!!!56-`U2!!!!"0-c$K3!!!!&%c-4Q8!!!!945"-c!!
+!!"Bh#dc-!!!!&bMi6-`!!!!B'Z*-c!!!!"N-cdc-!!!!'J!!6-`"5!!E!!"-c!p
+E!"`!!%c-(A!!(3!!6-`VK!!H!!"-c$QC!"q&(L0p!!!!))8H''B!!!!KK4i`c!!
+!!#+&(NNe!!!!)i8HBC`!!!!NK4jk"3!!!#9hdS8H!!!!*PpTK4i!!!!R4`1&(J!
+!!#JZQS8H!!!!+4BcK4i!!!!U!!#&(J)i!#X!!)8H'Ti!,!!!K4ic"`!Y!!#&(NY
+Y!#i!!)8HBpF!,le`-S%!!!!`[A!LZ3!!!$'pF%9b!!!!-Ve`D#m!!!!c[A#+j`!
+!!$5pF+fP!!!!0DU%[A!!!!!fKmHpF!!!!$GP$Ve`!!!!1%*4[A!!!!!j(jLpF!!
+!!$S!!,e`!bJ!1`!![A!Pi3!m!!#pF%LH!$d!!,e`DeF!2J!![A#1&!!rpF*"K3!
+!!%$e`Ld,!!!!3IA#@KF!!!"#pF+(+!!!!%2e`V3c!!!!42A#i88!!!"&h6Ee`J!
+!!%D`*IA#!!!!4i-CpF)!!!")9JMe`J!!!%NSrIA#!!!!5J!!pF)%'!",!!$e`M%
+N!%`!!2A#AM8!63!!pF+,3!"1!!$e`VK5!%rrrfB,,K3!82rr9)iZ&!"4rrpl##i
+8!&,rrk'(,K3!8rrrb!%Z&!"8rrrZIbi8!&AV#2rr,K3!9X5*rrmZ&!"ARJrrrbi
+8!&KhNIrr,K3!@9%ArrmZ&!"D,K6rrc'6!&XZ&2rr@!d!A#i8rrpqM!"G,K6rrk8
+'!&iZ&2rrbi8!ArrrMePQCJ"Jrrq#M@CQ!'(rrjkeCQB!B[rrZYpQCJ"MrrrA"fC
+Q!'6rrr-bCQB!CI#SrrpQCJ"Qe(hrrfCQ!'Hi9[rrCQB!D*`VrrpQCJ"TJ!6rrfC
+Q!'TQC[rrD28!DfCQrrq&(!"XCQErrk&(!'eQC[rr[@m!EQCQrrrCQJ"[rrqiTjk
+i!($rrl#0RVJ!FIrr`Q'HZ!"brrr81*ki!(2rrqB0RVJ!G2rrpq5HZ!"epNMrrjk
+i!(ENF[rrRVJ!Gp+GrrqHZ!"i`-Errjki!(QZmIrrRVJ!HTkirrqJ9`"lRVMrrl)
+X!(bHZ2rra!)!ICkirrr9e`"qRVMrrqHZ!(rrrq(fe`S!J2rrhScA#J#"rrrQ$YF
++!),rrqf4e`S!Jrrrp42A#J#%rrrmPYF+!)AlkIrre`S!K[4QrrrA#J#(l16rrpF
++!)MPBIrre`S!LGhIrrrA#J#+e`VrrpHj!)[A#[rrhcX!M0F+rrrQ[J#0e`Vrrqj
+!!)lA#[rrpF-!MpF+rj!%!*!!e`ViI[rr!*(A#[$mrrm!NYF+kARrr`#6e`VKprr
+r!*6A#YTdrrm!PGXKe`Vrr`#@iU6A#[rr!*IU*YF+rrm!Q2'Te`Vrr`#Cq5[A#[r
+r!*VrrpF+re%!Qrrre`Vhc`#FrrrA#["-!*hrrpF+k-S!R[rre`VK5!#IRVMrrrr
+q!+#HZ1iVrrm!SCkih&Irr`#LRVM+J2rr!+1HZ,LVrrm!T*kiTY6rr`#PU(#HZ2r
+r!+Dk4Tkirrm!Tm`ERVMrr`#ShI+HZ2rr!+R[ajkirrm!U[rrRVMqB3#VrrqHZ1b
+-!+crrjkifVB!VIrrRVM)i3#ZrrqHZ,F+!+pQC[rrrri!X'CQipRrr`#aCQE(XIr
+r!,*QCUZ(rrm!XfCQMerrr`#dCQCc02rr!,9e[QCQrrm!YT(TCQErr`#hVK"QC[r
+r!,M+1fCQrrm!ZHCLCQErr`#krrpQC[ea!,[rrfCQi8S![2rrCQE&(`#prrpQCUM
+h!,lrrfCQM-d![bi8rrrrr3$!,K6CK[rr!-%Z&,--rrm!`Li8M)hrr`$$,K4Q%rr
+r!-3Z&$q9rrm!a8--,K6rr`$'DBXZ&2rr!-H3!!8Z&2rr!-LfJbi8rrm!bGcp,K6
+rr`$+rrmZ&2b"!-[rrbi8eJF!c2rr,K5[L!$0rrmZ&)N1!-lrrbi8BSm!c`!!pF,
+e[J$3!!$)YrA#!0%!!*ZVpF)!dJ!!ETVe`J$6!!""MrA#!03!!"4ppF)!e4L-!!$
+e`J$@4Cd!!2A#!0GbU3!!pF)!f*qk!!$e`J$Cc-8!!2A#!0Ve`J!!mDS!frA#!!$
+%RJ$FpF)!!*H0!0he`J!!DS)!h[A#!!!pF3$I!!#pF,eY!1!!!*Uh[A!!i3!!Grk
+pF!$L!!"93Ee`!1-!!$+*[A!!j!!!$mZpF!$P%Z`!!,e`!1BeU3!![A!!jeKL!!#
+pF!$SHam!!,e`!1QGf!!![A!!kVe`!!#k5!$V[A!!!*H2!1bpF!!!G0)!lEe`!!"
+5'3$Z[A!!!#pF!1m!!)8HK4`!m!!!E,L&(J$a!!"88S8H!2)!!$[TK4i!m`!!)i+
+&(J$d!!!,'B8H!2806!!!K4i!pL@e!!#&(J$h2KX!!)8H!2K@K!!!K4i!q@lV!!#
+&(J$kK4i!!),Q!2Z&(J!!DS!!r)8H!!"5&`$pK4i!!$Qa!2k&(J!!)8J!r`#3#J&
+S!N!!N!3"D!*!!!!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!
+!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!
+!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!
+!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!
+!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!
+!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!
+!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!$,%!J6@"0F-eJ3$2!!!-X3#"0B%e`c@
+"!-m!!!ba!)%eJ6A$0B%!c`!!$,%!J6@"0F-eJ3$2!!!-X3#"0B%e`c@"!-m!!!b
+a!)%eJ6A$0B%!c`!!$,%!J6@"0F-eJ3$2!!!-X3#"0B%e`c@"!-m!!!ba!)%eJ6A
+$0B%!c`!!$,%!J6@"0F-eJ3$2!!!-X3#"0B%e`c@"!-m!!!ba!)%eJ6A$0B%!c`!
+!$,%!J6@"0F-eJ3$2!!!-X3#"0B%e`c@"!-m!!!ba!)%eJ6A$0B%!c`!!$,%!J6@
+"0F-eJ3$2!!!-X3#"0B%e`c@"!-m!!!ba!)%eJ6A$0B%!c`!!$,%!J6@"0F-eJ3$
+2!!!-X3#"0B%e`c@"!-m!!!ba!)%eJ6A$0B%!c`!!$,%!J6@"0F-eJ3$2!!!-X3#
+"0B%e`c@"!-m!!!ba!)%eJ6A$0B%!c`!!$,%!J6@"0F-eJ3$2!!!-X3#"0B%e`c@
+"!-m!!!ba!)%eJ6A$0B%!c`!!$,%!J6@"0F-eJ3$2!!!lX3$E03$rq$AmrqNe!Ir
+rpc8!rrSe!2rb03$rp$8!rq8e!2rf03$rpc8"rrrq03$rrM8"rrq"0B%!c`!!0,%
+!fc8!rrJe!2rp03$rk68!rrFe!2rk03$rmM8!rr3e!2rC03$rq$8!rrFe!2q"0B%
+!c`!!HE%!h$8#rcArq68!rrde!2rq0Ilrr6AqrrderIrq03$rr6Aqrrie!2rq03$
+rrM8!rrier[rq03(r0Ilr!6ArrM8!rrier[rk0IlrqMAprrder[rq03(rrrie!rm
+errrq0IlrqMAqrrie!Irrr68!rrder[q)0B%!c`!!P,%!h$8#rcArq6Amrrie!2r
+q032r06ArrM8$rc8errie!2rq03$rrM8!rrie!2rq03Er06Ar06ArrM8!rrie"2m
+e0Irrr68$rc8errie!2rq03$rr$8!rrie!2rl03$rrM8$rc8errie!2rq03$rrM8
+%rrme0Irq03$rq$8!rr`e!2rp03$rrM8!rrie!2q*0B%!c`!!LV%!h68!rrie!2r
+k03$rr68$rc8errie!2rq0Ihr!M8errie!2rq03$rrM8!rrie!2rq03Er0ImercA
+rrM8!rrie!rme0Irm03,r0Irp03$rq$8!rrFe!2rq03$rrMAprrie!2rq03$rrM8
+!rrie!2ri03$rr$8!rrde!2rq03$rrM8!riNeJ3$2!!#%X3$G03$rrM8!rrSe!2r
+p03,r06Amr`)e0Irq032r06ArrM8!rrie!2rq0IcrrM8'rcAr0Imerrie!2rq032
+r06Arr$8"rrrl0IlrqMAqrrSe!2rq032r06ArrM8!rrie!2rq03$rrM8!rrie!2r
+i03$rr$8!rrde!2rq0IcrL6@"!-m!!(ka!0ieq[rl03$rr68$rc8errXe!2rq032
+r06ArrM8!rrie!2rq03$rq68!rrie!2rp03$rrM8$rc8err`e![merrNe!2ri03$
+rqc8!rrie!rme0Irq03$rrM8!rrie!2rq03$rrM8!rrJe!2rm03$rr68!rrie!2q
+&0B%!c`!!PV%!hM8!rr`e!2rl03$rr68$rc8errie!rme0Irq032r06ArrM8!rri
+e!2rq03$rrM8!rrde!2rq03$rr68!rrie!rme0Irm032r06ArrM8!rrie!2rm03$
+rrM8!rrXe!2rq032r06ArrM8!rrie!2rq03$rrM8!rrie!2ri03$rr$8!rrde!2r
+q03$rrM8!riNeJ3$2!!"aX3$H03$rr$8!rrXer2rp0Ilrr6AprrierIrq03$rr6A
+qrr`e!2rq03$rr$Aqrrie!2rm03$rrM8!rrier[rk0IlrqMAprrderIrq03$rrM8
+!rrie!2rp03(rrrSe!2rm03$rr68!rrder[q)0B%!c`!!%V%!Yc8!rlme!2q"0G%
+eJ3$2!!!@X3#l03$rrM8!rlme!2q"0G%eJ3$2!!!1X3#k0IlrJ6@00B%!c`!!$,%
+!J6@"0F-eJ3$2!!!-X3#"0B%e`c@"!-m!!!ba!)%eJ6A$0B%!c`!!$,%!J6@"0F-
+eJ3$2!!!-X3#"0B%e`c@"!-m!!!ba!)%eJ6A$0B%!c`!!$,%!J6@"0F-eJ3$2!!!
+-X3#"0B%e`c@"!-m!!!ba!)%eJ6A$0B%!c`!!$,%!J6@"0F-eJ3$2!!!-X3#"0B%
+e`c@"!-m!!!ba!)%eJ6A$0B%!c`!!$,%!J6@"0F-eJ3$2!!!-X3#"0B%e`c@"!-m
+!!!ba!)%eJ6A$0B%!c`!!$,%!J6@"0F-eJ3$2!!!-X3#"0B%e`c@"!-m!!!ba!)%
+eJ6A$0B%!c`!!$,%!J6@"0F-eJ3$2!!!-X3#"0B%e`c@"!-m!!!ba!)%eJ6A$0B%
+!c`!!$,%!J6@"0F-eJ3$2!!!-X3#"0B%e`c@"!-m!!!ba!)%eJ6A$0B%!c`!!$,%
+!J6@"0F-eJ3$2!!!-X3#"0B%e`c@"!-m!!!ba!)%eJ6A$0B%!c`!!$,%!J6@"0F-
+eJ3$2!!!+J3#"!)%!J3$"!!!+J3#"!)%!J3$"!!!+J3#"!)%!J3$"!!!+J3#"!)%
+!J3$"!!!+J3#"!)%!J3$"!!!+J3#"!)%!J3$"!!!+J3#"!)%!J3$"!!!+J3#"!)%
+!J3$"!!!+J3#"!)%!J3$"!!!+J3#"!)%!J3$"!!!+J3#"!)%!J3$"!!!+J3#"!)%
+!J3$"!!!+J3#"!)%!J3$"!!!+J3#"!)%!J3$"!!!+J3#"!)%!J3$"!!!+J3#"!)%
+!J3$"!!!+J3#"!)%!J3$"!!!+J3#"!)%!J3$"!!!+J3#"!)%!J3$"!!!+J3#"!)%
+!J3$"!!!+J3#"!)%!J3$"!!!+J3#"!)%!J3$"!!!+J3#"!)%!J3$"!!!+J3#"!)%
+!J3$"!!!+J3#"!)%!J3$"!!!+J3#"!)%!J3$"!!!+J3#"!)%!J3$"!!!+J3#"!)%
+!J3$"!!!+J3#"!)%!J3$"!!!+J3#"!)%!J3$"!!!+J3#"!)%!J3$"!!!+J3#"!)%
+!J3$"!!!+J3#"!)%!J3$"!!!+J3#"!)%!J3$"!!!1[`#"NmH6S!$XNi%!X`!!$Vm
+!JC2(NkJ!h*1"!,X!!#1r!!'6Ni&!bd!"Nj1Y!256rJ!!32S!!%$k!!&!!256J3$
+!!!!d[`!"Nj1"3-Y!!C16XJ$hN`3!!%!!32`!!N!!32`!!N!!32`!!N!!32`!!N!
+!32H6J3$&!!![[`!"Nj1"3-Y!!C16Y3$jN`%!!2a!rJ$m32i!r%$q!2a!rJ$m32i
+!r%$jNi%!b!!!-Vm!!C16J8$,3!'6NlJ!qT-!32S!!%$k!!"!qJ!!32S!!%$k!!"
+!qJ!!32X!qT1"!-X!!$Lr!!'6Ni&!bd!"Nj1l!2Z6r3!!32S!!%$k!!"!qJ!!32S
+!!%$k!!"!qJ!!32S!!N!!!2Z6J3$1!!"+[`!"Nj1"3-Y!!C16[J$lN`"!r!!#3!"
+!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r3$lNi%
+!d3!!2lm!!C16J8$,3!'6Nm!!r*-!32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i
+!r%$q!2a!rJ$m3!%!!2b6J3$6!!!q[`!"Nj1"3-Y!!C16`J$mN`"!qJ!!32S!!%$
+k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!q`$mNi%!e3!!3lm!!C16J8$,3!'
+6Nm3!rC2q!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!
+"3!$pNi%!e`!!@Vm!!C16J8$,3!'6NmB!rC2p!!*!!%$m!!*!!%$m!!*!!%$m!!*
+!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!4!!%!!!2f
+6J3$C!!"'[`!"Nj1"3-Y!!C16a`$qN`!!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i
+!r%$q!2a!rJ$m32i!r%$q!2a!rJ$p32k6J3$D!!")[`!"Nj1"3-Y!!C16b3$pNrd
+!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!#3!!
+!rC1"!0`!!%Lr!!'6Ni&!bd!"Nj2,!2f6q`!!32S!!%$k!!"!qJ!!32S!!%$k!!"
+!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!r3$pNi%!hJ!!Blm!!C16J8$,3!'6Nm`
+!rT-"!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$
+m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!2k6J3$I!!"-[`!"Nj1"3-Y
+!!C16c3$qNri!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$
+q!2a!rJ$m32i!r%!!!2k6J3$J!!"-[`!"Nj1"3-Y!!C16cJ$qNrX!!%$k!!"!qJ!
+!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$p!2k6J3$
+K!!"1[`!"Nj1"3-Y!!C16d!$qN`"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!
+!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32X!rT1"!1-!!'br!!'6Ni&!bd!"Nj2
+4!2k6!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!
+!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!%$qNi%!j!!
+!8lm!!C16J8$,3!'6Np)!rT-!32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$
+q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!!3!!rT1"!18!!&#r!!'6Ni&!bd!
+"Nj26!2k6qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S
+!!%$k!!"!qJ!!32S!!%$m!2k6J3$Q!!"5[`!"Nj1"3-Y!!C16e!$qN`"!qJ!!32S
+!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S
+!!%$l!2k6J3$R!!"b[`!"Nj1"3-Y!!C16e!!%Nj0!!%$m!!*!!%$m!!*!!%$m!!*
+!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*
+!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!Nj1"!1F!!&Hr!!'6Ni&!bd!"Nj29!!+
+6Nd$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i
+!r%$q!2a!rJ$m32i!r%!$!!#6Ni%!k!!!9,m!!C16J8$,3!'6NpB!rT2l!!"!qJ!
+!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!
+!32S!!%$p!2k6J3$T!!"8[`!"Nj1"3-Y!!C16e`$qNrS!!%$k!!"!qJ!!32S!!%$
+k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32`!rT1
+"!1S!!(Dr!!'6Ni&!bd!"Nj2A!!16N`"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"
+!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"
+!r!!#3!"!r!!#3!"!r!!#3!"!r!!"Nj1"!1S!!&Hr!!'6Ni&!bd!"Nj2B!2k6!3!
+!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i
+!r%$q!2a!rJ$m32i!r%$qNi%!k`!!@Vm!!C16J8$,3!'6NpJ!!C16r!!!32S!!%$
+k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$
+k!!"!qJ!!32i!!C16J3$V!!"D[`!"Nj1"3-Y!!C16f3!"Nj2l!!"!qJ!!32S!!%$
+k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$
+k!!"!r3!"Nj1"!1`!!(Ur!!'6Ni&!bd!"Nj2C!!'6Nr`!!N!!32`!!N!!32`!!N!
+!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!
+!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32i!!C16J3$X!!"D[`!"Nj1
+"3-Y!!C16f3!"Nj2m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$
+m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!rN!"Nj1"!1`!!&br!!'6Ni&!bd!
+"Nj2D!!'6Nri!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$
+k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!0!!*16J3$Y!!"F[`!"Nj1"3-Y!!C1
+6fJ!"Nj2q!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!
+!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!$3!#6Ni%!l3!!I,m!!C16J8$,3!'6NpS
+!"T16!!"!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*
+!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*
+!!%$m!!4!!%#6Ni%!l3!!AEm!!C16J8$,3!'6NpX!!C16rN$q!2a!rJ$m32i!r%$
+q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$
+q!2a!rJ!#3*16J3$Z!!"E[`!"Nj1"3-Y!!C16f`!#Nj0!qJ!!32S!!%$k!!"!qJ!
+!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!
+!32X!!C16J3$Z!!"E[`!"Nj1"3-Y!!C16f`!#Nj0!qJ!!32S!!%$k!!"!qJ!!32S
+!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32X
+!!C16J3$Z!!"m[`!"Nj1"3-Y!!C16f`!$Nj-!32`!!N!!32`!!N!!32`!!N!!32`
+!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`
+!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!C16J3$Z!!"F[`!"Nj1"3-Y
+!!C16f`!$Nj-!!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a
+!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m3!'6Ni%!lJ!!AEm!!C16J8$,3!'
+6NpX!!C16r3!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S
+!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!"%!!!*16J3$Z!!"G[`!"Nj1"3-Y!!C1
+6f`!"Nj2p!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!
+!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!%3!!!Nj1"!1i!!(kr!!'6Ni&!bd!"Nj2
+E!!'6Nri!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`
+!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`
+!!N!!32`!"8!!3!#6Ni%!lJ!!AEm!!C16J8$,3!'6NpX!!C16rN$q!2a!rJ$m32i
+!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i
+!r%$q!2a!rJ!#3*16J3$Z!!"E[`!"Nj1"3-Y!!C16f`!#Nj0!qJ!!32S!!%$k!!"
+!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"
+!qJ!!32X!!C16J3$Z!!"D[`!"Nj1"3-Y!!C16fJ!"Nj2k!!"!qJ!!32S!!%$k!!"
+!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"
+!r!!"Nj1"!1d!!(Zr!!'6Ni&!bd!"Nj2D!!+6Nd$m!!*!!%$m!!*!!%$m!!*!!%$
+m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$
+m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$p!!'6Ni%!l3!!@lm!!C16J8$
+,3!'6NpS!!T16!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a
+!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$p3!'6Ni%!l3!!@Vm!!C16J8$,3!'
+6NpN!"*16!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!
+!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!#3*16J3$X!!"D[`!"Nj1"3-Y!!C16f3!
+%Nj-!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!
+!32S!!%$k!!"!qJ!!32S!!%$k!!*!Nj1"!1`!!(Ur!!'6Ni&!bd!"Nj2C!!@6N`"
+!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*
+!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!0
+!!*16J3$X!!"C[`!"Nj1"3-Y!!C16f!!"Nj2q!2a!rJ$m32i!r%$q!2a!rJ$m32i
+!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!!J#6Ni%
+!k`!!@,m!!C16J8$,3!'6NpJ!rT2p!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"
+!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!*!!!$qNi%!k`!!@Em
+!!C16J8$,3!'6NpF!!C16r3!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$
+k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!%3!!!Nj1"!1S!!(Dr!!'6Ni&
+!bd!"Nj2A!2k6"!!!3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!
+#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!
+#3!"!r!!#3!"!rT1"!1S!!&Hr!!'6Ni&!bd!"Nj2@!2k6!%$q!2a!rJ$m32i!r%$
+q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%!
+"!!$qNi%!k3!!9Vm!!C16J8$,3!'6Np8!!C16q`!!32S!!%$k!!"!qJ!!32S!!%$
+k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!r3!"Nj1"!1J
+!!&Dr!!'6Ni&!bd!"Nj28!!'6Nr`!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$
+k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32i!!C16J3$R!!"a[`!"Nj1
+"3-Y!!C16e!$qNri!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`
+!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`
+!!d!!3!$qNi%!j`!!8lm!!C16J8$,3!'6Np-!rT-"3%$q!2a!rJ$m32i!r%$q!2a
+!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!rT1"!1B
+!!&#r!!'6Ni&!bd!"Nj25!2k6q`!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S
+!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$p!2k6J3$P!!"3[`!"Nj1"3-Y!!C1
+6d3$qNr`!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"
+!qJ!!32S!!%$k!!"!rJ$qNi%!j!!!Dlm!!C16J8$,3!'6Np!!rT2q!!*!!%$m!!*
+!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*
+!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!0!!%!!rT1"!1-!!%qr!!'6Ni&!bd!"Nj2
+1!2k6!%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$
+m32i!r%$q!2a!!3!!rT1"!1%!!%br!!'6Ni&!bd!"Nj20!2k6r!!!32S!!%$k!!"
+!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32i!rT1"!1!
+!!%br!!'6Ni&!bd!"Nj2-!2k6r3!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S
+!!%$k!!"!qJ!!32S!!%$k!!"!qJ!#3!!!rT1"!0m!!'+r!!'6Ni&!bd!"Nj2,!2f
+6!`"!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$
+m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!&!!2f6J3$H!!"([`!"Nj1"3-Y!!C1
+6b3$pN`%!!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$
+m32i!r%$pNi%!h!!!4lm!!C16J8$,3!'6NmF!rT2q!!"!qJ!!32S!!%$k!!"!qJ!
+!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!8!!rT1"!0S!!%1r!!'6Ni&!bd!
+"Nj2'!2f6!3"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!
+!32S!rC1"!0N!!&Dr!!'6Ni&!bd!"Nj2%!2f6!%$m!!*!!%$m!!*!!%$m!!*!!%$
+m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$p!2f6J3$
+A!!"![`!"Nj1"3-Y!!C16`J$mNrj!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$
+m32i!r%$q!2a!rJ!!32b6J3$9!!!m[`!"Nj1"3-Y!!C16`!$mNrX!!%$k!!"!qJ!
+!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32d!r*1"!0-!!$Zr!!'6Ni&!bd!"Nj1
+q!2Z6rJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!&!!2Z6J3$4!!"
+&[`!"Nj1"3-Y!!C16Z`$lN`%!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!
+!32`!!N!!32`!!N!!32`!qj1"!-i!!$5r!!'6Ni&!bd!"Nj1i!2U6rN$q!2a!rJ$
+m32i!r%$q!2a!rJ$m32i!r%$q!!"!qT1"!-X!!$#r!!'6Ni&!bd!"Nj1e!2Q6r3!
+!32S!!%$k!!"!qJ!!32S!!%$k!!*!!!$jNi%!b!!!+,m!!C16J8$,3!'6Nl)!pj2
+k!!"!qJ!!32S!!%$k!!"!r!$hNi%!a3!!*Vm!!C16J8$,3!'6Nkd!p*-!32`!!N!
+!32`!!N!!32d!p*1"!-!!!"5r!!'6Ni&!bd!"Nj1S!0b6J3#l!!!8[`!"Nj1"3-Y
+!!C16S!$XNi%!X`!!%Vm!!C16J8$,3!'6Ni%!J3#p!!!5[`!"Nj1"3-Y!!C16J3#
+"!,d!!"+r!!'6Ni&!bd!"Nj1"!)%![3!!%Vm!!C16J8$,3!'6Ni%!J3#p!!!5[`!
+"Nj1"3-Y!!C16J3#"!,d!!"+r!!'6Ni&!bd!"Nj1"!)%![3!!%Vm!!C16J8$,3!'
+6Ni%!J3#p!!!5[`!"Nj1"3-Y!!C16J3#"!,d!!"+r!!'6Ni&!bd!"Nj1"!)%![3!
+!%Vm!!C16J8$,3!'6Ni%!J3#p!!!5[`!"Nj1"3-Y!!C16J3#"!,d!!"#r!)'6aj2
+C!2f6J3#"!1N!!"#r!)'6aj2D!2H6J3#"!1i!!"1"!)%!i!$pN`&!!2D6J3#"!2-
+!!"H"!)%!i3$pN`%!!2a!!!$eNi%!J3$j!!!BJ3#"!1-!rC2l!!"!qJ!!32@6J3#
+"!2i!!"L"!)%!j3$mNrS!!%$k!!"!q`$eNi%!K!!!*S%!J3$Q!2f6!N!!32`!!N!
+!32`!!N!!32`!"%!!3!!!pC1"!)N!!#1"!)%!k!$pN`&!32i!r%$q!2a!rJ$m32i
+!r%$q!2D6J3#1!!!QJ3#"!1N!rC-!32S!!%$k!!"!qJ!!32S!!%$k!!*!!!$eNi%
+!P!!!+)%!J3$V!2f6!J!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ$eNi%!Q3!!1S%
+!J3$X!2f6"!!!3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"
+!r3$dNi%!S!!!-)%!J3$Z!2f6r8$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a
+!rJ!!32+6J3#R!!!dJ3#"!1m!rC-#!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"
+!qJ!!32S!!%$m!2'6J3#[!!!iJ3#"!2%!rC2p!!"!qJ!!32S!!%$k!!"!qJ!!32S
+!!%$k!!"!qJ!!32S!!%$k!!"!r3$aNi%!YJ!!8S%!J3$b!2f6r3!#3!"!r!!#3!"
+!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"
+!r!!#3!"!rJ$aNi%![J!!3i%!J3$d!2f6!!$m32i!r%$q!2a!rJ$m32i!r%$q!2a
+!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ!"3%$`Ni%!aJ!!4)%!J3$f!2b6r3!
+!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!
+!32S!mC1"!-d!!%L"!)%!p`$pNrX!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$
+k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ$dNi%!dJ!!EB%!J3$j!2f6!3"
+!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"
+!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!$lNi%
+!dJ!!8)%!J3$k!2f6rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a
+!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m3!!!rC1"!0%!!&#"!)%!r!$pNrS
+!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S
+!!%$k!!"!qJ!!32S!!N!!!2f6J3$3!!"3J3#"!2d!rC-!32S!!%$k!!"!qJ!!32S
+!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S
+!!%$pNi%!cJ!!FS%!J3!"!!$pN`-!3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"
+!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"
+!r!!#3!"!r!!#3!"!r!!#3!"!r!!!32f6J3$0!!"4J3#"!!!!rC-"3%$q!2a!rJ$
+m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$
+m32i!r%$q!2e!rC1"!-X!!%q"!))!rC-"!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S
+!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!rC1"!-S
+!!%k"!)3!r*-#!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"
+!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!q`$pNi%!b!!!ES%!K3$pNri!!N!!32`
+!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`
+!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32d!rC1"!-F
+!!%q"!)F!rC2m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i
+!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!!8"!rC1"!-8!!%k"!)J!rC2q!!"!qJ!
+!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!
+!32S!!%$k!!"!q`$pNi%!a!!!6S%!LJ$pNr`!!%$k!!"!qJ!!32S!!%$k!!"!qJ!
+!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$p!2f6J3$
+#!!"YJ3#,!2f6r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!
+#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!
+#3!"!r!!$3!"!!2b6J3$"!!"2J3#0!2f6!3!!r%$q!2a!rJ$m32i!r%$q!2a!rJ$
+m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2f6J3#
+r!!"1J3#1!2f6r!!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!
+!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32i!rC1"!,d!!%k"!*!!!2f6qJ!!32S
+!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S
+!!%$k!!"!qJ!#3!!!rC1"!,`!!'k"!*%!rC-"!%$m!!*!!%$m!!*!!%$m!!*!!%$
+m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$
+m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!&!!2f6J3#k!!"3J3#6!2f6!%$q!2a
+!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a
+!rJ$m32i!r%$q!2a!!!$pNi%!Z3!!6B%!P3$mNrS!!%$k!!"!qJ!!32S!!%$k!!"
+!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!8!!rC1
+"!,F!!%q"!*B!rC-"!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S
+!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!rC1"!,B!!'k"!*J!rC-%!!"
+!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*
+!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!2f
+6J3#d!!"1J3#C!2f6rN$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i
+!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2e!rC1"!,-!!%k"!*X!rC-#!!"
+!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"
+!qJ!!32S!!%$k!!"!qJ$pNi%!X3!!6S%!R!$pNri!!%$k!!"!qJ!!32S!!%$k!!"
+!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$l!2f
+6J3#`!!"ZJ3#H!2f6r3!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"
+!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"
+!r!!#3!"!r!!#3!"!rJ$pNi%!VJ!!6i%!R`$pNra!rJ$m32i!r%$q!2a!rJ$m32i
+!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ!"3%$
+pNi%!V3!!6S%!S3$pNrd!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!
+!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$m!2f6J3#V!!"1J3#M!2b6r!!
+!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!
+!32S!!%$k!!"!qJ!!32d!rC1"!+S!!'q"!+3!rC-!32`!!N!!32`!!N!!32`!!N!
+!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!
+!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!d!!3!$pNi%!U!!!6S%!TJ$pNri
+!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i
+!r%$q!2a!rJ$m32i!r%$q!2f6J3#R!!"1J3#R!2f6q`!!32S!!%$k!!"!qJ!!32S
+!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32i
+!rC1"!+8!!&#"!+N!rC-!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"
+!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!N!!!2f6J3#N!!"[J3#U!2f
+6!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`
+!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`!!N!!32`
+!!8!!rC1"!+)!!&'"!+`!rC-"3%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a
+!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!!!$pNi%!S3!!6i%
+!V3$pN`"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S
+!!%$k!!"!qJ!!32S!!%$k!!"!qJ!"3!$pNi%!R`!!8)%!V`$pN`)!!%$k!!"!qJ!
+!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!
+!32S!!%$k!!"!rC1"!*i!!'k"!,%!r*-%!!"!!%$m!!*!!%$m!!*!!%$m!!*!!%$
+m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$
+m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!2f6J3#F!!"1J3#b!2f6r8$q!2a!rJ$
+m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$
+m32i!r%$q!2e!rC1"!*X!!%k"!,3!rC2q!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$
+k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ$pNi%!Q3!
+!6S%!Y3$pNrd!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$
+k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$m!2b6J3#B!!"ZJ3#h!2f6r!!#3!"!r!!
+#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!
+#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!rJ$pNi%!PJ!
+!8)%!Z!$pN`!!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$
+q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!!"!rC1"!*3!!%k"!,S!rC2m!!"!qJ!
+!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!
+!32S!!%$k!!"!r!$pNi%!N`!!6S%!Z`$pNrX!!%$k!!"!qJ!!32S!!%$k!!"!qJ!
+!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$q!2f6J3#
+4!!"`J3#p!2f6!3"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"
+!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"!r!!#3!"
+!r!!#3!"!r!!$3!"!!2f6J3#3!!!!6i%![J$pNri!r%$q!2a!rJ$m32i!r%$q!2a
+!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%!"!!$
+pNi%!MJ!!6S%!`!$pNrS!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!
+!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$q!2f6J3#0!!"2J3$#!2b6!%$
+k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$
+k!!"!qJ!!32S!!%$k!!&!!2f6J3#,!!"`J3$$!2f6!`"!!%$m!!*!!%$m!!*!!%$
+m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$
+m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!*!!%$m!!&!!2f6J3#+!!"1J3$&!2f
+6rN$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i!r%$q!2a!rJ$m32i
+!r%$q!2a!rJ$m32i!r%$q!2a!rC1"!)J!!&#"!-B!rC-"!%$k!!"!qJ!!32S!!%$
+k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$k!!"!qJ!!32S!!%$
+k!!&!!2f6J3#(!!!-J3$)!)'6pT1"!)8!!!b"!-J!JC2hNi%!K!!!#S%!J3#"!)%
+!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%
+!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%
+!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%
+!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%
+!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%
+!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%
+!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%
+!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%
+!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%
+!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%
+!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%
+!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%
+!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%
+!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%
+!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%
+!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%
+!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%!`3!!#S%!J3#"!)%
+!`3!!!+!!J`$rij%!!!%!!!!"(!!!!"`!!!"'!3!+@BqU!bPI!!C)H!-",b`!"Nk
+Y!F)[,!!'F!-[!#!,+R"KD@jd-5jLGc!#!!!!3PG`G%*ADh-!N!T#9h"d3PGVF`#
+3'-qde8)!N!B"BPm!&PQ2-#i!%NM!,`#S2b"X!!BJ8#&I!"SSE[rm6Pj1G8j@!!!
+[$#KZ!!JJE!!')&!aE!!@!#"`%,"X!"CZ$L"X!!BJ8$&m!"!!(Q!+)'`!"L"33QJ
+!(M!X!"C63'FB8d"R&&9!Ca"C3'F-88"R)J4!!""R0Q"-)'`!"L"3-A`!!3#3"!J
+!6J!#!G`#GJ!!!!`,3Q9KCfaP9fpbDh-!!!%!!!!"(!!!!"`!!!"'!$Zja"XZ!!!
+!(!"'!!&h8'pc!!!!%P088L!!!!!H!qRrr`#3#,rdrrm!!!!-!*!%-U%!:
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/ClarisDraw.hqx b/writerperfect/qa/unit/data/draw/libmwaw/pass/ClarisDraw.hqx
new file mode 100644
index 000000000..dfdaa69a5
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/ClarisDraw.hqx
@@ -0,0 +1,160 @@
+(This file must be converted with BinHex 4.0)
+:#R0TEA"XC5jME'3!C%4bGd0%FRF!N!3e@3!!!D([eJ%!X3"&@&"A!!%!3NZ%!*!
+%![!#3!#3$!,`!N!"!!!"!*!5!3!!!J!#!*!(3NMB!!%!N!Vrr`#3"3%!!3!!!%J
+!!!!)!!!!!3!!!!%!3NMB!*!%!3-!!3#3#3i!3NZ!!*"R&3!"!")!!3#3$8*,L!#
+3#48!!!!-!!%!!"%"!!)!!J!!!3#3"!%"!!!"!!%!,3!!!3!!!C!*!*!N!3!!"J!
+&"!!"!*!%3!!"!!N!#3!)!"8!%!!3!3#3"&S!!!!*!*!("J%!N!3"!N!!N#0#5e`
+!3NY3!%*,9!!"!*!(3NYm!*!&!3"#5hJ!N!F"!!)!!`!%!!8!!!"#5C3!N!8"!!!
+!!3!!B3#3$!J!!!!"!!!!!3!!B!!$!*!+#J!"!!"!!!!"!!"K!J%!N!S-!!)!!3!
+!!$)!!'!!!`#3#J%!!`!#!!!!!3!!B3#3$"3!"!!"!!!!!3!!B3#3#`%X!!8!3NA
+m!!!!%!!#!*$r!!"#5f3!N!3"!*!13NNm!%**5!#3"!%!N!4#563!N(9#56!!N2m
+!N2m!N)%%!!)!N!8*!*!M"`!#rrm!N!6rN!i!N"i5!!!!!3!"!3!!!!%&"I`!!!%
+!!3!#!*!,!3!#!3!!m!%!N!a)!!i*!!!$!3%"!!!"!!%"!3!1!!!"!%!#J!#3"d!
+"i!#3#3%!!!!"!!!#!!3!N%N"!3%!)!#3"f3!N#)"!J!!!3!!!%!&N!!!N!TX!!(
+rr`!!!'!!!!!#!!)!N'&i!!m!!!")!%J!N!3#m!*!rr(rlJ-*!P*M!J8S!r`"!!!
+!!@J"D!#3"!k`#d!!!3%!!'3!!3!!!!%!!J!!!!%R$`!"!*!1%!#3#4!!rlArTJm
+Y#jS!#!%!N!dC!3#3$J&-!!Mrr`!!!#J!!!!"!"8!!3!5)!%(5'9KC'PZCfRk!%I
+b5!"#5e`!!!!B!%k!U!"JDK3!5J!9!!%!$#!"#P0eBQKPB@4TEQG(mNJ!3NYF!!!
+!'!"1J+J!B'S8!%S!&3!!!!`J!3a5C@GeE'&b)(4PH(4)!%*,A!!!!"J!6S#S!'"
+U&!"+!"8!"3!1)#m'9A*RC@jdFL"dCAKd5!"#5e`!!!!B!%k!U!"JDK3!5J!9!!8
+!$#!"#8PYF'pbG'&ZG'9iG%J!3NYF!!!!'!"1J+J!B'S8!%S!&3#!!!`J!3P$B@j
+MC@aXC@4PH(4)!%*,A!!!!"J!6S#S!'"U&!"+!"8!!`!+)!%%6QpdC@9XE'9NCAK
+d5!"#5e`!!!!B!%k!U!"JDK3!5J!9!3!!$#![#N0[FR*PBh4TEfjiG%J!3NYF!!!
+!'!"1J+J!B'S8!%S!N!FJ!!$rr`!!!!3!&!!"!!8!!!%!!3%!!!%"!!!!!3!"*a!
+!!!!3!!$rr`!!!!`!"!!"!%*,B!!!!"!!!2rr!!!!"!!%!!%!3NYS!*!A0!!#rrm
+!!!!8!!!!!MrrJ!#3#!%!!!X!!!!%!$rrJ!#3#!)!!!N!!!!*!*!%Y!!'rrm!!!!
+F!!!!!J!!!!%!!!N!!!!*!*!8!3!!%J!!!")!N"3"!!!E!!!!#3#3&!%!!$B!!!!
+5!*!8!3!!5!!!!!N!!!!*!!!!#3#3$!%!!%J!!!!*!!!!#3!!!!N!!!!*!!!!#3#
+3",3!"[rr!!!!(!!!!!)!!!!#3!+3!!#3"crliiiiiiiiiii!#'%!N!3"3!#eDY@
+V9UeDYMrpY*p*p*p*p*m!#Q!$!!!!!6rr`!#3"crqUT!(U`!-B3%!!!!"2rk4)N5
+*%L4)N6rriFFFFFFFFFF!!@!$!!!!!8!"jQD3"crmMMMMMMMMMMN!&'%!N!3"2rc
+e`SpF+2A#Md!"K9@3"`%XB3#3#`(b!!Rrr`!!!$B!!!!"!+-!!!!"!!!!#`#3"!M
+(J+-53faKFQPc)&K86N3J3R*TC'GP-3#3$3&38`"339GA8!!!%deTBh*[FfpQG#"
+AEh*VFb!a,M&Y%`!!,1!J-5jB)&4bB@jcE'&dEh)8@&414!"8FQ&ZFfaKG'pb)%a
+TFh34@&41#%&MG'%J-bi`)!!!!E!J8(*PCQ9bC@jM%deTBh*[FfpQG!"AEh*VFb!
+a,M&Y%`!!,1!J-5jB)&3!!NC-4dN!!2rr!*!AS`!!!!%!!!!-!*!%#-H!Sa*$E'&
+bDA-J@&414#"#FQPNCf8`!*!0!9"6!$*"9eG3!!!66@PMFQpcEfCd)&G[FQYc)$)
+Z-!!r!!!X,'aP9fpbDh0K!!!!T(4[FL"-DA0d!&K86N3J-L"8FQ&ZFfaKG'pb&d0
+XBA*TFb"B9%j%)&"bC@CPFQ9ZBf9c%N-66@PMFQpcEfCd!&G[FQYc)$)Z-!!r!!!
+X,'aP9fpbD`!#4Na(53!!rrm!!J#3"2id!*!2S`!!!!%!!!!B!*!%#-H!Sa*$E'&
+bDA-J@&414#"#FQPNCf8!N!i"69-!!!!d!!Rrr`!!!!3!"!!"!%*,@!!"!!!!!3!
+"!!%!!J!"!!-!!3!%!!%!"3!"!!B!!3!(!!%!#!!!!!Na-M-d06Bh1$N!N!P1-,J
+!N!8"!*!-rrm!N!6rr`!"!!%!!!!"!*!,!3"K!!%!N"%#3!!!![!!N!B"!!%![!*
+I!*!&%`'Q!*!G3NP3!*!*3NP-!*"46LfB!%i!N!3"Y3*Z!%im!!!#!*!%!E8#EJ"
+#4B3!3NA)!%*'"!#3"4-!'3'Q!Pm!!3!!!3#3"!%!!!%!N!a11e`!N!9JikBP!*!
+8!3!)!*!(3NQ-!!!I*!!!!!J!N!V'!!!!SJ#3+!8!!`!M!!3!"J!-!!)!+!!$!Gd
+#F3!!"8`!"2rr!!!"8!!!!!%-6@&cG'9b)&0XD@4P3NN8!'"Q@!")i+S!3NN8!!!
+!3NNF!'"QNJ"*-*B!3NN8!!!!3NPJ!!!!!3"#5l`!!!!"!*!%)%),+J"#54`!3NN
+F!%M5QJ#3"dJ!B'DS!%N`'!"#54`!N!8"!%**@!"JCqJ!4DUN!%**(!"#5h!!!!!
+"!%*,[!!!!!%!!!!")%),+J"#5@!!3NNF!3%!5!#3"3J!!3!)!*!'3)$TB!!!!$!
+!!!!#!!!!&!!!!!`!!!!#3)"!J1Rf!)!!#!#!!*!%&i)!!!!"!%*,[!""T6)!!ad
+'3)$PN!!!6S#S3)$JMJ!!&i)!!!!"3%)!N!8'!*"&3NN%"daKH@9b)$&6E'PNC8*
+*&!"JCPJ!51#U!%**&!!!!%**(!"JCT)!56#@!%**&!!!!%**B!!!!!%!3NZm!!!
+!!3#3"#"##bS!3NNF!%**(!")dTS!N!G)!'"QU!"*-"J!3NNF!*!&!3"#59J!B'I
+S!%@UT!"#54`!3NY`!!!!!3"#5l`!!!!"!!!!!5"##bS!3NPJ!%**(!%"!%J!N!8
+)!!%!#!#3"N#!k@!!!!!`!!!!!J!!!"3!!!!-!!!!!N#!3)$TpJ#!!!J!J!#3""H
+#!!!!!3"#5l`!3D8b!!-G"N#!jC!!!%k!U%#!i)i!!"H#!!!!!8"#!*!&#3!!!!%
+!N%&#5h!(6'&jCA)J-P0XD@4P3NN8!'"Q@!")i+S!3NN8!!!!3NNF!'"QNJ"*-*B
+!3NN8!!!!3NPJ!!!!!3"#5l`!!!!"!*!%)%),+J"#54`!3NNF!%M5QJ#3"dJ!B'D
+S!%N`'!"#54`!N!8"!%**@!"JCqJ!4DUN!%**(!"#5h!!!!!"!%*,[!!!!!%!!!!
+")%),+J"#5@!!3NNF!3%!5!#3"3J!!3!)!*!'3)$TB!!!!$!!!!!#!!!!&!!!!!`
+!!!!#3)"!J1Rf!)!!#!#!!*!%&i)!!!!"!%*,[!""T6)!!ad'3)$PN!!!6S#S3)$
+JMJ!!&i)!!!!"3%)!N!8"!!!!!3#338*)f!G-BAPPFL!b!%ilA!"#4CJ!6MYF!%*
+&Q!"1!(@*k!"eF%3!GA"%!'"bNJ"ePj3!GCH8!%iKh!"J!%3!!3#3"Q2e!03"TJ!
+!!'"bdJ"&%iS(6'&jCA)J-3"12h3!B`%*!(F"E5"##bS!DJ%[!%*&j!!,8%B!6J"
+#!!3!&-I3!'"cC!!8b1J!6hFX!!!!GBRS!(9`4!"eF%3!B(-'!(@AP!"ePj3!!%#
+!iiS!!)4D!%*&N!!!B(-5!!$!B!"#!!3!&-I3)"3!&!!8ZB!!!-"J!%)!"2q3"!!
+!!!&bD3!"!!!!!3!!!!B!3r!S)%),+J"11e`!3N@3!2%k3)$M)J!!3&S!N!80!*"
+-!3#3%!8!3NP)!*!%!3#3"%**0!#3G8**-!#3r`#3r`#3J33!!J#3"3N!N"d3!!$
+rr`!!!!3!"!!"!%*&a!#3"``!!2rr!!!!B!!!!!)!N"S'$!%!rrm!!!!'!!!!!Iq
+3"J#3"RH3"P@3"[q3"!!!rrpQCJ!!hGd!N!6rr`!!QCPQCJ!!QCN!N!6Gh3!!QCR
+rr`!!lZi!N!4QCJ!!CQBc-`!!QCPQCM-cZj!'rj!%c-crN!5CQIq3"'CQrj!%-c2
+rrmc-rj!%c*!%rrr-c*QCrrr-c'CQrrr-c$-crrr-c!!!rrqCQIq3"*QCc-crrjQ
+3"2rrQCPQC[rrQCNc-rrrQCN!!2rrCQErN!4QCXc-rrpQCTQCrrpQN!6rrfCQ-c2
+rrc-crj!%-c2-c2rr-c1CQIrr-c0QC[rr-j!%rrmc-`!!rrm!!2q3"!!!c-crr`!
+!CQErr`!!-c2rr`#3"-c-rj!%c-crrmb3"2rrQCR-c2rrCQE-c2rr-c2-c2rr!!$
+-N!6rrmb3#TQCc*!%CQE-N!3c-mb3"!!!c-bCQIrrc-bCQFb3"*Q3"-c-QCPQCXc
+-QCNc-mc-QCN!!-c-CQErrmc-CQE-N!4QCTQCc-aQN!6-c'CQ-c2-c'CQ!!$-c$-
+crrr-c$-cc*!%-c1CQFc--c0QCXc--j!%c-`c-`!!c-`!!2rrc-`!!-b3"!!!QCR
+-c!!!CQE-c!!!-c2-c!#3"*QCrj!%QCRrrmc-QCRrrjQ3"2rrCQDCQIrr-c1CQIr
+r!!#CQFc-rrqCQFb3"*QCc-bCN!6-c'CQQCR-c$-cQCR-c!!!QC!%rrqCN!6-c*Q
+3#QCQQC!%-c1CN!3!!*QCCQErrjQCCQE-c*QCCQDCN!4QN!5CQ@CQ!!#CQ6-crrq
+CQ6-cc-bCQ6-cQC!%-c0QCTQC-j!%QCNc-`!!QCN!!2rrQCN!!-c-QCN!!*Q3"!!
+!CQDCQ3!!-c1CQ3#3"'CQrj!%CQErrmc-CQErrjQCCQErrfD3"2rr-c0QC[rr!!"
+QCXc-rrpQCXb3"'CQc-bCQ@CQc-aQN!6-c$-cCQE-c!!!CQDCQIrrCQDCQFc-CQD
+CN!4QCTQCCT!%QCNc-fCQQCN!!'D3"2rrCT!%c-aQN!5CQ@D3#M-cCT!%!!"QCM-
+crrpQCM-cc-aQCM-cQCPQCM-cCT!%-j!%CQB!!2rrCQB!!-c-CQB!!'D3"!!!-c0
+QCJ#3"$-crj!%-c2rrmc--c2rrjQC-c2rrfCQ-c2rrc13"2rr!!!c-mc-rrmc-mb
+3"$-cc-bCQ6-cc-aQCM-cc-`cN!6-c!!!-c1CQIrr-c1CQFc--c1CN!3c-jQCCQB
+c-jQC-j!%QCN!!$-cCQErrc-cCQE-c$-cCQDCQ6-cCT!%-c0QCM13"'CQ!!!cN!6
+rrc13"-c--j!%QCNcN!4QCM13#J!!-c-!!2rr-c-!!-c--c-!!*QC-c-!!'CQ-c-
+!!$13"!#3"[q3"!!!rrr-c!!!rrqCQ3!!rrpQCJ!!rrmc-`!!rrm!N!6-c2rr!!$
+-N!3!!-c-QCN!!-c-CQB!!-c--c-!!-c-!*!%QCR-c!!!QC!%!!#CQ@CQ!!#CQ6-
+c!!#CQ3#3"'CQrrm!!'CQc-`!!'CQQCN!!'D3"!!!CQBc-`!!-c2rr`!!-c2-c!!
+!-c1CQ3!!-c0QCJ!!-j!%!!!c-`#3"[rr!*!%c-`!N!5CQ3#3"'CQ!*!%-c2ZlJ#
+3",Zl!*!%UUS!N!5)L!#3"(Gh!*!%998!N!4%4!#3"#)L!*!%%4%!N!EGh3#3",Z
+l!*!%UUS!N!5)L!#3"(Gh!*!%998!N!4%4!#3"#)L!*!%%4%!N!EZlJ#3",Zl!*!
+%UUS!N!5)L!#3"(Gh!*!%998!N!4%4!#3"#)L!*!%%4(ZN!EGN!DUN!D)N!C%N!B
+LN!B4N!B!N!N64&0&9!!!!9i!!rrr!!!!1!#U!!%!!!!"!*!,!3&0!!!!![!!!!*
+!!!"#503!!!!"!*!4!3!"!*!'DHJ!N!`"B!#3"2q3"!#384aZG!%!#J#3#J,`!!!
+#3!!!!!%!!!)!!J#3#3)!N!3G"N#!!*!%rrm!N!3")!!$!!!q!!!!SJ!!!&!!!!$
+H!!!!!3!!!J!#!!%!N!F%!*!*J!!!rrm!N!3#)!-H!!"C!!!!Q!!!!&X!!!%K!!)
+!!4%!!J!#!!)!N"6rr`#3"f!!![rr!!!!+J!!!!)!N"%"!!%!N!CTk!#3$!&J!*!
++!NB!!!'6!!%!!3#3"N##!*!-!3#3%846493!!!$Z!!(rr`!!!$J!UJ!"!!!!!J#
+3#`%!!+4-Irrrrhrrrrm!3NM-!*!9!3!"!*!&!3#3$J&J!*!%rj!%!(m!N&)"!*!
+-![!!!!*!!!!!!3!!!J!#!*!*!`#3""d'3)!!N!6rr`#3"cB!!Irr!!!!+J!!!!)
+!N"%"!!%!N!CSeJ#3$!&J!*!)4&0&9!!!!,B!!2rr!!!!1!#U!!%!!!!$!*!06@P
+M!!,`!!!#3!!!3NM%!*!9!3!"!*!&!J#3$J&J!*!%rj!%!*"4('jd!!!!0J!"rrm
+!!!!U!!!!!J#3%3%!!3#3"QMF!*!-!@!!N!K%8d98!!!!9!!"!!!!"`#3"))!!3!
+!"!!!!!%!!!!(!!%!!3!"!!!!3NCB!%*&T!"#4I!!N!J%!*!)2!!5!%*&i!!"!")
+!N!F"!*!(#!#3#``!N!89!!%!%J!"!*!(#J#3"3J!3NN)!!!!#&0XD@4P)$)!N!P
+%8d98!!!!YJ!!rrm!!!!i!+S!!3!!!!8!N""rrrrrIrrrr`"#58!!N"8"!!%!N!C
+SVJ#3$!&J!*!%rj!%!*"A0J!"rrm!!!!U!!!!!J#3%3%!!3#3"QLZ!*!-!@!!N!K
+%8d98!!!"*J!#rrm!!!!i!+S!!3!!!!B!N!X"!8d!!!!#m!!!!N!!!%**!*!%!3#
+3%3%!!3#3"QRS!*!-!@!!N!6rN!3!N&%FER3"!!S!N!`%!!!AJJ!!!3!!!J!#!*!
+*"`#3""d'3)!!N!6rr`#3"!-J!!i!!"U!!!!DJ!!"HS!!!L@!!3!"(`!#!!)!!3#
+3&2rr!*!(B!!#rrm!!!!U!!!!!J#3%3%!!3#3"QRS!*!-!@!!N!S#4J!!!C-!!3!
+"!*!'3))!N!`"r!#3%%46493!!!$Z!!(rr`!!!$J!UJ!"!!!!"`#3#`%!!+4-Irr
+rrhrrrrm!3NMi!*!9!3!"!*!&"J#3$J&J!*!%rj!%!(m!N&)"!*!1"!!!&i)!!!%
+!!!)!!J#3#3J!N!3G"N#!!*!%rrm!N!Ff!!(rr`!!!#S!!!!#!*!4!3!"!*!'D0B
+!N!`"B!#3#%46493!!!#f!!$rr`!!!$J!UJ!"!!!!#!#3$8eTB`!#m!!!!N!!!%*
+*$!#3&3%!!3#3"3F!N!i"B!#3"2q3"!#384aZG!!!!$B!!Irr!!!!+J!!!!)!N"%
+"!!%!N!CSh!#3$!&J!*!)4&0&9!!!!CB!"2rr!!!!1!#U!!%!!!!*!*!,!3&0!!!
+!![!!!!*!!!"#5i`!!!!"!*!4!3!"!*!'DHJ!N!`"B!#3"2q3"!#384aZG!%!#J#
+3$!3!!"H#!!!"!!!#!!)!N!N+!*!%(3C!J!#3"2rr!*!%!5!!!`!!2J!!!'`!!!"
+-!!!!NJ!!!!%!!!)!!J#3#3`!N!Q!!!$rr`#3"!)J!`i!!&#!!!"VJ!!!8B!!!@L
+!!3!"!!!#!!)!N"Err`#3"!8J!)i!!)q!!!"pJ!!!r)!!!6Z!!3!"%3!#!!)!N"E
+rr`#3"f!!![rr!!!!+J!!!!)!N"%"!!%!N!CTk!#3$!&J!*!+!NB!!!'6!!%!!3#
+3"N##!*!-!I`!N""%8d98!!!!lJ!"rrm!!!!i!+S!!3!!!!S!N!X"!!#N6(rrrrp
+rrrrr!%**A!#3&3%!!3#3"3N!N!i"B!#3"2q3"!"r!*"5!3#3$J3!!"H#!!!"!!!
+#!!)!N!N,!*!%(3C!J!#3"2rr!*!(0J!"rrm!!!!U!!!!!J#3%3%!!3#3"QM@!*!
+-!@!!N!K%8d98!!!!YJ!!rrm!!!!i!+S!!3!!!!X!N!e0D@-!![!!!!*!!!"#593
+!N"8"!!%!N!8+!*!1!@!!N!6rN!3!N&%FER3!!!!f!!(rr`!!!#S!!!!#!*!4!3!
+"!*!'D0`!N!`"B!#3#%46493!!!"8!!%!!!!(!*!%JJ!"!!!-!!!!#3!!!!F!!3!
+"!!%!!!"#4J`!3NB)!%*'B!#3#!3!N!JQ!!i!3NC8!!%!$J#3"`%!N!F)!*!,$!#
+3"48!!!!-!!%!N!F+!*!&#!"#4K3!!!!)8faTC'8J-3#3#846493!!!$Z!!(rr`!
+!!$J!UJ!"!!!!$3#3#`%"63!!!!,`!!!#3!!!3N9F!!!!!3#3#J*'!!!"N`!"!!%
+!N!CTk!#3$!&J!*!%rj!%!*"4('jd!3!+!*!-"!!!&i)!!!%!!!)!!J#3#3i!N!3
+G"N#!!*!%rrm!N!GJ!!,rr`!!!#S!!!!#!*!+!NB!!!'6!!%!!3#3"QRS!*!-!@!
+!N"%"!!%!N!C!JJ#3$!(m!*!34&0&9!!!!1i!!Irr!!!!1!#U!!%!!!!1!*!,!3!
+!T%arrrrrIrrrr`"#4A3!N"8"!!%!N!80!*!1!@!!N!6rN!3!I`#38J%!N!i%!!!
+AJJ!!!3!!!J!#!*!*$`#3""d'3)!!N!6rr`#3"cB!!Irr!!!!+J!!!!)!N"%"!!%
+!N!CSeJ#3$!&J!*!)4&0&9!!!!,B!!2rr!!!!1!#U!!%!!!!2!*!06@PM!!,`!!!
+#3!!!3N9N!*!9!3!"!*!&$J#3$J&J!*!%rj!%!*"4('jd!!!!0J!"rrm!!!!U!!!
+!!J#3%3%!!3#3"QMF!*!-!@!!N!K%8d98!!!!lJ!"rrm!!!!i!+S!!3!!!"!!N!X
+"!8d!!!!#m!!!!N!!!%**)!!!!!%!N"%"!!%!N!CTk!#3$!&J!*!%rj!%!*"4('j
+d!3!+!*!-"!!!&i)!!!%!!!)!!J#3#4%!N!3G"N#!!*!%rrm!N!GJ!!,rr`!!!#S
+!!!!#!*!4!3!"!*!'DHJ!N!`"B!#3#J*'!!!"N`!"!!%!N!BG"J#3$!&J!*!34&0
+&9!!!!1i!!Irr!!!!1!#U!!%!!!!4!*!,!3!!T%arrrrrIrrrr`"#54J!N"8"!!%
+!N!83!*!1!@!!N!6rN!3!I`#38J%!N!i%!!!AJJ!!!3!!!J!#!*!*%J#3""d'3)!
+!N!6rr`#3"cB!!Irr!!!!+J!!!!)!N"%"!!%!N!CSeJ#3$!&J!*!)4&0&9!!!!,B
+!!2rr!!!!1!#U!!%!!!!5!*!06@PM!!,`!!!#3!!!3NN3!*!9!3!"!*!&%3#3$J&
+J!*!%rj!%!*"4('jd!!!!0J!"rrm!!!!U!!!!!J#3%3%!!3#3"QMF!*!-!@!!N!a
+'6P40!!!!9!!"rrm!!!")!!!!!3!9!"8!3Nb!#8KPE(CPG'PMBH0k!!#%@J"#6)!
+!!&pXCAKd!*!&)%),+L!)3)!!4Lh'!*!%CAKd!*!&3)$69J!!Af`!N!3Z1!!!!3!
+!!!&2!!!!6`!!!&)!!!"X!!!'cJ!!!%i!!!!"!J!!*3!!!)!!!!!&!*!%#R0TEA"
+XC5jME'3!!J!!!'4%FRG$4(*h!*!+C%4bGd0%FRF!N"M4CljZ!*!'!D%!N(VrN!J
+!!!!V!31!X3!!"6%Z-(Bc(N0XBA*TFd4bBAFJ-5i`GM-0CQpb)%eKBfPZG'pcD!!
+!!!d"!i#a!!!&-5i`GM-!N!3,#N0XBA*TFd4bBAF!!!%!!!!"6`!!!%m!!!"5!%*
++2"Tb!!!!(!"5!!&fCA*c!!%!%P088L!!!!!U!!(rr`#3#3,rr`!!!#m!N!5rp2r
+r!!!!3!#3""G5:
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/ClarisWorks_2.0.hqx b/writerperfect/qa/unit/data/draw/libmwaw/pass/ClarisWorks_2.0.hqx
new file mode 100644
index 000000000..ec786ea6b
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/ClarisWorks_2.0.hqx
@@ -0,0 +1,161 @@
+(This file must be converted with BinHex 4.0)
+:#R"KD@jd-LjMGfX!3eG39%*23Nm"!!!#mb`!!!'L!53#!$`$3Np#6`!"!%m)E!#
+3"!-B!Q3!13!j!$N!13!j!$N#h`)V!3!!!3#3%J%!!!)!!J!!!%m*U!!"!*!&!3!
+"!!)!(&La!!N!!!!"!!!!!3"2#DJ!N!3'%`#3#`i!6`QB!*"R&3!!$!%!N!e2#!!
+%"!#3"48!!!`"!!"BJ3),!!!"!*!&!3!!!3!"!#d!!3%!!3#3"&S!!!!5!*!&"J%
+!N!3"!'3!N#8-!!$rr`!!!'!!!!!#!!!!H!!2!!!!5!")!*!%![!#32rarqi$#3*
+5B`)&+!2m!3!!!!&S!@J!N!31X!Y!!!%"!!"N!!%!!!!"!!)!!!!"*`m!!3#3$K!
+!N!N3!2qerkB2,3ZD!!J"!*!0'3%!N"FF!!$rr`!!!!3!%!!"!!8!!!%!!3%!!!%
+!N!T2,,`%!*!%!3!3!*!+rrm!N!6rr`!"!!%!!!!"!*!,!3'K!!%!N")"X3!!!E%
+!N!8"!!%!8J*U!*!'!DB!N"e2"l3!N!P2"k3!N(92"b!!N!Fb!DB#DJ!"!!!"!*!
+%!3!!!3#3$%m`E!#3"9VP*JX!N!i"!!J!N!G2"k`!!"mN!*!-rj!)!#J!!`(G!R`
+!!d46493!!!$i!!,rr`!!!"B!`!!#"!!!!3!)E1!!6`Q8!!J!6`Rm!$P!J2ZU!*!
+&6`QJrj!%!E)"XJ"2#F!!@Ydm!&UF-J!"!%m*Y2q3"!'b!E)!5!'a!E%!!!!##!F
+C&!J!!IB"!*!&8)FSJCUUdUS&&!6d"06"k@D%i[,LmM+QbbM,+-XQbbDU-'#5%d#
+U-$%)"R)[J-12"i)ZhX11"+CPaLb@"a"RYQHQ*HJQUR$H!03!!3!"!'N!N!S#1!'
+Q!!%!!3!!!eS!N!TXi!!!!!%!!3!!"%X!N!S#1!'Q!!%!!3!!!eS!!!J)!!!1i!!
+!!2m!!2q3"J!"rj!%c-`!![q3"*QC!!2rN!4QCJ!%rj!%-c-!"Iq3"!!!!!Errmc
+-rrm!"rrrc*!%!!Mrrmc-QCN!#Irrc-aQCJ!+rrr-c$-c!![rrmc-!!!!$2rrQCR
+rr`!0rrqCQFc-!!lrrjQ3"!!2rrqCQ@CQ!"$rrjQC-c-!%IrrQCN!!!!5rrpQC[r
+r!"2rrfCQc-`!&2rrCQDCQ3!9rrpQN!3!&[rrCQBc-`!ArrpQCJ!!!"Mrrc-crrm
+!'Irr-c2-c!!Drrmc-jQC!"[rrc-cCQB!(2rr-j!%!"hrrc-c!!!!([rr!!$rr`!
+Irrm!!-c-!#$rr`!!QCN!)Irr!!"QCJ!Lrrm!!$-c!#2rr`#3"56-c2q3"!!Pc-c
+rrmc-!#E-c2rrQCN!*mc-rrpQCJ!Sc-crrc-c!#R-c2rr!!!!+Xb3"2rr!#[-N!B
+!,-b3"*QC!#h-N!4QCJ!Zc*!%-c-!,mb3"!!!!$$-c*QCrrm!-Fc-QCR-c!!bc-b
+CN!3!-mc-QCPQCJ!dc-bCQ6-c!$A-c*QC!!!!0Xc-CQErr`!hc-aQCXc-!$M-c'C
+QQCN!1Fc-CT!%!$V-c'CQ-c-!1mc-CQB!!!!mc-`c-rrr!$h-c$-cc-`!2Xc--c1
+CQ3!rc-`c-fCQ!%$-c$13"!""c-`c-`!!!%,-c!!!rrm!3mc-!!$-c!"%c-`!!*Q
+C!%A-c!!!CQB!4Xc-!!!c-`"(c-`!N!9)QCRrN!3!5CQCrrr-c!"+QCRrrjQC!%Z
+CQIrrCQB!6*QCrrmc-`"0QCRrr`!!!%kCQFc-rrm!6jQCc*!%!&#CQFc-QCN!8CQ
+Cc-aQCJ"5QCR-c$-c!&1CQFc-!!!!9*Q3"2rr!&@CN!6-c!"@QC!'!&HCN!4QCJ"
+BQC!%-c-!@CQ3"!!!!&UCQ@CQrrm!@jQCCQE-c!"FQCPQCTQC!&fCQ@D3"!"HQCP
+QCM-c!&qCQ@CQ!!!!B*QC-c2rr`"KQCNc-mc-!'+CQ6-cQCN!BjQC-c0QCJ"NQCN
+cN!3!CCQC-c-!!!"QQCN!!2rr!'HCQ3!!c-`!D*QC!!#CQ3"TQCN!!'CQ!'UCQ3!
+!-c-!DjQC!*!&E'CQrj!%!'eQC[rrc-`!EQCQrrqCQ3"[CQErrfCQ!("QC[rr-c-
+!F@CQrrm!!!"bCQE-c2rr!(0QCXb3"!"dCQE-c*QC!(9QCXc-CQB!GQCQc-`c-`"
+hCQE-c!!!!(KQCTQCrrm!H@CQQCR-c!"kCQDCN!3!HfCQQCPQCJ"mCQDCQ6-c!(e
+QCTQC!!!!IQD3"2rr!(pQN!6-c!#!CT!%QCN!J@D3"J##CT!%-c-!JfD3"!!!!)4
+QCM-crrm!K@CQ-c2-c!#'CQBc-jQC!)GQCM-cCQB!L'CQ-j!%!)PQCM-c!!!!LQC
+Q!!$rr`#,CQB!!-c-!)aQCJ!!QCN!M@CQ!!"QCJ#1CQB!!$-c!)pQCJ#3"C!!-c2
+rN!3!N6-crrr-c!#5-c2rrjQC!*-c-rrrCQB!P$-crrmc-`#9-c2rr`!!!*Bc-mc
+-rrm!Pc-cc*!%!*Jc-mc-QCN!Q6-cc-aQCJ#D-c2-c$-c!*Xc-mc-!!!!R$-cQCR
+rr`#G-c1CQFc-!*ic-jQ3"!#I-c1CQ@CQ!+!c-jQC-c-!S6-cQCN!!!#L-c0QC[r
+r!+-c-fCQc-`!T$-cCQDCQ3#P-c0QN!3!TM-cCQBc-`#R-c0QCJ!!!+JcN!6rr`#
+T-j!%c-`!UM13"*QC!+XcN!4QCJ#X-j!'!+dcN!3!!!#Z-c-!!2rr!+mc-`!!c-`
+!X$-c!!#CQ3#a-c-!!'CQ!,)c-`!!-c-!Xc-c!*!&Y!!!rj!%!,8!!2rrc-`!YJ!
+!rrqCQ3#h!!$rrfCQ!,J!!2rr-c-!Z3!!rrm!!!#k!!$-c2rr!,X!!-b3"!#m!!$
+-c*QC!,d!!-c-CQB![J!!c-`c-`#r!!$-c!!!!-!!!*QCrrm!`3!!QCR-c!$#!!#
+CN!3!``!!QCPQCJ$%!!#CQ6-c!-8!!*QC!!!!aJ!!CQErr`$(!!"QCXc-!-J!!'C
+QQCN!b3!!CT!%!-S!!'CQ!!!!b`!!CQBc-`$-!!!c-rrr!-d!!$-cc-`!cJ!!-c1
+CQ3$2!!!c-fCQ!0!!!$13"!$4!!!c-`!!!0)!N!6rr`$6!*!%c-`!e!#3"*QC!08
+!N!4QCJ$@!*!%-c-!eqlZ!*!&f0hG!*!&fEZl!*!&fUUU!*!&fiL)!*!&h(Gh!*!
+&h999!*!&hN4%!*!&hb)L!*!&i"%4!*!&i3!!lZi!!!$L!!$Gh3!!!1-!!,Zl!!!
+!j!!!UUS!!!$P!!#)L!!!!1B!!(Gh!!!!j`!!998!!!$S!!"%4!!!!1N!!#)L!!!
+!kJ!!%4%!!!$V!*!%lZi!l!#3"0hG!1d!N!5lZ`$Z!*!%UUS!l`#3")L)!2!!N!4
+hG`$a!*!%998!mJ#3"%4%!2-!N!3L)J$d!*!%%4%!pHk3"J$fhC!'!2HlN!B!q+U
+3"J$jL*!'!2ThN!B!qe@3"J$m4*!'!2dLN!B!rK'3"J$r!*!(!Z6F!*$r!*$r!*$
+r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$
+r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$
+r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$
+r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$
+r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$
+r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$
+r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*#jr`!!!2m!!!$r!!!!r`!!!2m!!!$r!!!
+!r`!!!2m!!!$r!!!!r`!!!2m!N2m!N)`MN#X!N2m!N($r!2m!r`$r!2m!)j",!2m
+!r`$r!2m!r`#3r`#39L13A`#3r`#352m!!!$r)j"a!!$r!!!!r`#3r`#30L13I`#
+3r`#3+[m!r`$r!#13L`$r!2m!r`#3r`#3(L13P`#3r`#3&2m!!!$r)j#K!!$r!*$
+r!*!-)j#V!*$r!!$r!2mMN,Ar!2m!N2JMN,d!N2$r!!!MN-Ar!*$V)j$,!*$Mr`!
+MN0-!r`#3h#13f3#3e[m!)j$I!*$5)j$P!*$+r`!MN1X!r`#3a#13m3#3`513pIm
+!N,XMN2X!N,Ar!#13r`$r!*#a)j$r)j!%!*#Yr`!MN2mMN!J!N+XMN2mMN!`!N+A
+r!#13rb13%!$r!*#K)j$r)j!8!*#I)j$r)j!B!*#F)j$r)j!D!*#Brb13rb13([m
+!N*8MN2mMN#!!N*-MN2mMN#3!N*!MN2mMN#B!N)cr!#13rb13+!$r!*#+)j$r)j!
+U!*#*)j$r)j!Zr`#3K513rb13-!#3JrmMN2mMN$,r!*#")j$r)j!d!*#!)j$r)j!
+fr`#3IL13rb130J#3IL13rb131!#3I#13rb131J#3H[mMN2mMN$S!N(SMN2mMN$`
+!N(Ir)j$r)j!qr`#3GL13@2mM)rmMN"2r)j!)rb13"[rr)rmM)rmMN,F!N(BMN&R
+r)b2r)j!Frb13"ImMN!Er)j#i!*"e)j!irrrr)j!(rrrr)b2r)rrr)b2rrb-M)rr
+rrb13"2mM)rmMN!6r)rrr)j!%rrrr)j!%rb-Mrb2rrb-Mrrrr)b-Mrrrr)rmM)rm
+M)b2rrb13X`#3G5130rmM)b2r)j!&rb-M)rmMrrmM)rrr)b2r)rmM)b2r)b-Mrb-
+Mrb13"2rr)b2r)b2r)b-Mrb-M)rmM)rrr)b2r)rmMN!Ar)b-Mrb-Mrb-Mrb-Mrb1
+3XJ#3G5131[rr)j!&rb13"ImM)b2r)b-Mrb13"2rr)b-Mrb-Mrb13"2mMN!6r)j!
+%rrmM)b2r)b2r)b-Mrb2r)j!&rb-M)rmM)rmMrb13"2mMN,%!N(2r)j!jrrmMrb1
+3"[rrrb-Mrb-M)rmM)b2r)b2rrb2r)b-Mrb-Mrb13"2mMN!6r)b2rrb2r)b-Mrb-
+Mrb-M)rmMrb13"ImM)b2r)b2r)rq3"L13XJ#3Fb1312mM)b2r)j!*rb2r)b-Mrb-
+M)rmMrb-M)rmM)b2r)b2r)j!%rb13"2mMrb-M)rmM)b2r)b2r)b-Mrb2r)j!&rb-
+M)rmM)rmMrb13Y`#3F[mMN$Mr)b2rrb13"ImM)b2r)rmM)b2r)b-Mrb2r)b2rrb-
+M)rmM)rmMN!6rrb-Mrb-Mrb-MrrmM)b2r)b2r)b-Mrb2r)j!&rb-M)rmM)rmM)rm
+M)rmMN,2r!*"b)j!jrrmM)rmMN!ArrrmM)rmM)b2r)b-Mrb-MrrmM)rmM)rmM)rm
+MN!6r)rrr)j!%rrmM)rmM)rmM)rmM)b2r)b2rrb-M)rmM)b2r)b2r)b-MrrmMN,3
+!N(,r)j"Lrb13hJ#3Fb13B[mMN0i!N(,r)j"Lrb13h[m!N()MN2mMN%)!N(3MN2m
+MN%!!N(8MN2mMN%!!N(8MN2mMN%!!N(8MN2mMN%!!N(BMN2mMN$lr!*"f)j$r)j!
+q!*"i)j$r)j!m!*"k)j$r)j!k!*"krb13rb131J#3I#13rb131!#3IImMN2mMN$E
+r!*"q)j$r)j!f!*#!)j$r)j!d!*##)j$r)j!b!*#%)j$r)j!`!*#')j$r)j!Z!*#
+)rb13rb13+J#3M#13rb13+!#3MImMN2mMN#Er!*#2)j$r)j!N!*#4r`!MN2mMN#!
+!N*BMN2mMN"i!N*Mr)j$r)j!Dr`#3Qb13rb13'!#3Rb13rb13&!$r!*#K)j$r)j!
+3!*#Pr`!MN2mMN!`!r`#3U513rb13#!#3Vb13rb13"!$r!*#a)j$r!*#er`!MN2X
+!r`#3ZL13p3#3`2mMN2%!N-BMN1X!N-Rr!2mMN1Ar!2m!N-mMN0m!N0Ir)j$C!!$
+r!*$E)j$6!*$Kr`$r!#13b`$r!2m!N1JMN-8!N2$r!!!MN,hr!*$k)j#e!*$r!2m
+!r`!MN+X!r`$r!*$r!*!,)j#K!*$r!*!Ar`!MN*F!!!$r!*$r!*!J)j#,!*$r!*!
+Ur`$r!2m!)j"r!2m!r`$r!*$r!*!h)j"a!*$r!*"(r`!!!2m!)j"I!!!!r`!!!2m
+!N2m!N&JMN%X!N2m!N'Vr!2m!r`$r!2m!r`$r!2m!)j!V!2m!r`$r!2m!r`$r!2m
+!r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3TAB!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!
+!!(B!!!"f!!!!GJ!!!(B!!!"f!*$r!*#0)j!S!*$r!*#-GL13+!#3$hB!!!"f!!!
+!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"f!!!
+!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ#3r`#3,513+!#3%&@36`#3r`#3,AB
+MN#J!N!pf9C"2GJ#3r`#3,513+!#3%&@36`#3r`#3,ABMN#J!N!pf9C"2GJ#3&RB
+!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B
+!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B
+!!!"f!!!!GJ!!!(B!!!"f!*#P)j!S!*!39C"2!*!B6*"`!*#NGL13+!#3$hC9N%p
+f!*!@GNb3F!#3T513+!#3%&@36`#3'%b3F!#3T(BMN#J!N!pf9C"2GJ#3&RC-N(!
+!N+8MN#J!N""9N%m!N"K-N(!!N+4f)j!S!*!2GP@36hB!N"Cf6*"`!*#P)j!S!*!
+39C"2!*!B6*"`!*#NGL13+!#3$hC9N%pf!*!@GNb3F!#3T513+!#3%&@36`#3'%b
+3F!#3T(BMN#J!N!pf9C"2GJ#3&RC-N(!!N+8MN#J!N""9N%m!N"K-N(!!N+4f)j!
+S!*!2GP@36hB!N"Cf6*"`!*#P)j!S!*!39C"2!*!B6*"`!*#NGL13+!#3$hC9N%p
+f!*!@GNb3F!#3T513+!#3%&@36`#3'%b3F!#3T(BMN#J!N!pf9C"2GJ#3&RC-N(!
+!N+8MN#J!N""9N%m!N"K-N(!!N+4f)j!S!*!2GP@36hB!N"Cf6*"`!*#P)j!S!*!
+39C"2!*!B6*"`!*#NGL13+!#3$hC9N%pf!*!@GNb3F!#3T513+!#3%&@36`#3'%b
+3F!#3T(BMN#J!N!pf9C"2GJ#3&RC-N(!!N+8MN#J!N""9N%m!N"K-N(!!N+4f)j!
+S!*!2GP@36hB!N"Cf6*"`!*#P)j!S!*!39C"2!*!B6*"`!*#NGL13+!#3$hC9N%p
+f!*!@GNb3F!#3T513+!#3%&@36`#3'%b3F!#3T(BMN#J!N!pf9C"2GJ#3&RC-N(!
+!N+8MN#J!N""9N%m!N"K-N(!!N+4f)j!S!*!2GP@36hB!N"Cf6*"`!*#P)j!S!*!
+39C"2!*!B6*"`!*#NGL13+!#3$hC9N%pf!*!@GNb3F!#3T513+!#3%&@36`#3'%b
+3F!#3T(BMN#J!N!pf9C"2GJ#3&RC-N(!!N+8MN#J!N""9N%m!N"K-N(!!N+4f!(B
+!GJ"f!(B!GJ"f!(B!GJ"f!(B!GJ"f!(B!GJ"f!(B!GJ"f!(B!GJ#3$hC9N%pf!*!
+@GNb3F!#3r`#348b3F!#3r`#34(C-N(!!N2m!N%9-N(!!N2m!N%4f!!!!GJ!!!(B
+!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B
+!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B
+!!!"f!!!!GJ#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3A846493!!!"8!!$
+rr`!!!#J!5!!"!!!!!J!!!%X!!!$%m`"rrrrrIrrrr`"2#$`!!!!"!*!4!3!"!*!
+&!5qL!*!-!9S!!!"J!!,rr`!!!#S!!!!#!*!4!3!"!!!!6`QS,k)!N!`"@J#3%3%
+!!3#3"3%!@J#3$!%'!*!84Nj863!!!&3!!Irr!!!!5!!!!!%!&3!9!*!%#8KPE(C
+PG'PMB3#30N099&-!N!4%8e90!!!!*J#3$`i08'9bCQpbE@%J9A0PFJ#3#%K%6NN
+!!!!'!!"&9%*-!!!!1%C19%d!![*33e988`!#mUa%8e90!!,bY%K%6NN!![,L494
+#6!!#mZcrr[hmqrVjq2$am[2dpIEhGBX!!!%!!!!"5!!!!%J!!!"D!!!S[`K,CAN
+J3f&`Flm#!!!!C'CTE'YPH@-K!!"S!!!*F'&TER3ZBhGV!J!!!%0A8&4#6d*2!*!
+-3eG39%*23Nm!N"M2Xq0a!*!'!D)!N!B1!!!!+,m)6QpdC5"3B@5r!J!#!%&38%a
+ZF'4d)3!!D!"!!*!%+-J!N!d"$UX!!5!!UQ-p!+TM23#3)`&-!!N!N!`C!!!!+,m
+!!!!18'9bCQpbE@%J9A0PFJ#3"#,2Xq0a!!"35808!qJ!!Fqcih&"GA4S9%9B9!2
+U!!-!N!F-#d0XBA*TFeG[FQYc!!!"!!!!!8J!!!")!!!!@J"2#@3D&!!!!"`!@J!
+#9%9B9!!!!"T`EQpd!!!!*P088L!!!!!b!qVrr`#3#[rr!!!!%J"2"h5rp2rr!!!
+!1!"2"f"p)J:
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/ClarisWorks_4.0.hqx b/writerperfect/qa/unit/data/draw/libmwaw/pass/ClarisWorks_4.0.hqx
new file mode 100644
index 000000000..4b44db2ec
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/ClarisWorks_4.0.hqx
@@ -0,0 +1,181 @@
+(This file must be converted with BinHex 4.0)
+:#R"KD@jd0#jMGfX!3eG39%*23Nm"!!!#qC3!!!'L'6m%!*`!3Np#6`!"!&J9R!#
+3"!-B!Q3!13!j!$N!13!j!$N#h`)V!3!!!3#3%J%!!!)!!3!!!&J65!!"!*!&#!!
+"!!!!!3!"!!)!(&La!!N!!!!"!!!!!3"B%dJ!N!3'%`#3#`i!6`#3D48!!!`"!*!
+2@"@J"!6rr`!!!!%!"J(j!3#"@!!#!!)!N!S"!!!"!!%!,3!"!3!"!*!%@J!!!")
+!N!8'!3#3"!%!!3#3'3i08'9bCQpbE@%J9A0PFJ#3$hJ!$`!!!%J!5!#3"!,`!N$
+rmIrZ!`N#8Q-#"5J$r!%!!!!"D!&S!*!%$V!,3!!"!3!!C!!"!!!!!3!#!!!!!5F
+2!!%!N!i3!*!*%!$rYIqQ$bd,QJ!)!3#3$4N"!*!,(!!!rrm!!!!%!"!!!3!&!!!
+"!!%"!!!"!*!+@C-X"!#3"!%!%!#3#[rr!*!%rrm!!3!"!!!!!3#3#`%"S3!"!*!
+5!E%!!!'a!*!&!3!"!&)#DJ#3"J'Q!*!G@"-S!*!*@"-N!*"e@"@X!*!(-J'Q!QS
+!!3!!!3#3"!%!!!%!N!aCY,!!N!9T*e),!*!1!3!)!*!(@"08!!!I*!#3$JX!!!"
+#!!!S!!-"h3*m!!0%8d98!!!"%J!#rrm!!!!@!0S!!J3!!!%!#'fd!&J62!!)!&J
+61!"6hpl)!3"B%d!!F"#!rj!%!E)"XJ"B%c3!@ir#!&J63!!!!(!4C2q3"!'b!E)
+!5!'a!E%!!!!##!FC&!J!!IB"!*!&8)FSJCUUdUS&&!6d"06"k@D%i[,LmM+QbbJ
+!N"V,+-XQbbDU-'#5%d#U-$%)"R)[J-12"i)ZhX11"+CPaLb@"a"RYQHQ*HJQUR$
+H!03!!3!"!'N!N!S#1!'Q!!%!!3!!!eS!N!TXi!!!!!%!!3!!"%X!N!S#1!'Q!!%
+!!3!!!eS!!!J)!!!1i!!!!2m!!2q3"J!"rj!%c-`!![q3"*QC!!2rN!4QCJ!%rj!
+%-c-!"Iq3"!!!!!Errmc-rrm!"rrrc*!%!!Mrrmc-QCN!#Irrc-aQCJ!+rrr-c$-
+c!![rrmc-!!!!$2rrQCRrr`!0rrqCQFc-!!lrrjQ3"!!2rrqCQ@CQ!"$rrjQC-c-
+!%IrrQCN!!!!5rrpQC[rr!"2rrfCQc-`!&2rrCQDCQ3!9rrpQN!3!&[rrCQBc-`!
+ArrpQCJ!!!"Mrrc-crrm!'Irr-c2-c!!Drrmc-jQC!"[rrc-cCQB!(2rr-j!%!"h
+rrc-c!!!!([rr!!$rr`!Irrm!!-c-!#$rr`!!QCN!)Irr!!"QCJ!Lrrm!!$-c!#2
+rr`#3"56-c2q3"!!Pc-crrmc-!#E-c2rrQCN!*mc-rrpQCJ!Sc-crrc-c!#R-c2r
+r!!!!+Xb3"2rr!#[-N!B!,-b3"*QC!#h-N!4QCJ!Zc*!%-c-!,mb3"!!!!$$-c*Q
+Crrm!-Fc-QCR-c!!bc-bCN!3!-mc-QCPQCJ!dc-bCQ6-c!$A-c*QC!!!!0Xc-CQE
+rr`!hc-aQCXc-!$M-c'CQQCN!1Fc-CT!%!$V-c'CQ-c-!1mc-CQB!!!!mc-`c-rr
+r!$h-c$-cc-`!2Xc--c1CQ3!rc-`c-fCQ!%$-c$13"!""c-`c-`!!!%,-c!!!rrm
+!3mc-!!$-c!"%c-`!!*QC!%A-c!!!CQB!4Xc-!!!c-`"(c-`!N!9)QCRrN!3!5CQ
+Crrr-c!"+QCRrrjQC!%ZCQIrrCQB!6*QCrrmc-`"0QCRrr`!!!%kCQFc-rrm!6jQ
+Cc*!%!&#CQFc-QCN!8CQCc-aQCJ"5QCR-c$-c!&1CQFc-!!!!9*Q3"2rr!&@CN!6
+-c!"@QC!'!&HCN!4QCJ"BQC!%-c-!@CQ3"!!!!&UCQ@CQrrm!@jQCCQE-c!"FQCP
+QCTQC!&fCQ@D3"!"HQCPQCM-c!&qCQ@CQ!!!!B*QC-c2rr`"KQCNc-mc-!'+CQ6-
+cQCN!BjQC-c0QCJ"NQCNcN!3!CCQC-c-!!!"QQCN!!2rr!'HCQ3!!c-`!D*QC!!#
+CQ3"TQCN!!'CQ!'UCQ3!!-c-!DjQC!*!&E'CQrj!%!'eQC[rrc-`!EQCQrrqCQ3"
+[CQErrfCQ!("QC[rr-c-!F@CQrrm!!!"bCQE-c2rr!(0QCXb3"!"dCQE-c*QC!(9
+QCXc-CQB!GQCQc-`c-`"hCQE-c!!!!(KQCTQCrrm!H@CQQCR-c!"kCQDCN!3!HfC
+QQCPQCJ"mCQDCQ6-c!(eQCTQC!!!!IQD3"2rr!(pQN!6-c!#!CT!%QCN!J@D3"J#
+#CT!%-c-!JfD3"!!!!)4QCM-crrm!K@CQ-c2-c!#'CQBc-jQC!)GQCM-cCQB!L'C
+Q-j!%!)PQCM-c!!!!LQCQ!!$rr`#,CQB!!-c-!)aQCJ!!QCN!M@CQ!!"QCJ#1CQB
+!!$-c!)pQCJ#3"C!!-c2rN!3!N6-crrr-c!#5-c2rrjQC!*-c-rrrCQB!P$-crrm
+c-`#9-c2rr`!!!*Bc-mc-rrm!Pc-cc*!%!*Jc-mc-QCN!Q6-cc-aQCJ#D-c2-c$-
+c!*Xc-mc-!!!!R$-cQCRrr`#G-c1CQFc-!*ic-jQ3"!#I-c1CQ@CQ!+!c-jQC-c-
+!S6-cQCN!!!#L-c0QC[rr!+-c-fCQc-`!T$-cCQDCQ3#P-c0QN!3!TM-cCQBc-`#
+R-c0QCJ!!!+JcN!6rr`#T-j!%c-`!UM13"*QC!+XcN!4QCJ#X-j!'!+dcN!3!!!#
+Z-c-!!2rr!+mc-`!!c-`!X$-c!!#CQ3#a-c-!!'CQ!,)c-`!!-c-!Xc-c!*!&Y!!
+!rj!%!,8!!2rrc-`!YJ!!rrqCQ3#h!!$rrfCQ!,J!!2rr-c-!Z3!!rrm!!!#k!!$
+-c2rr!,X!!-b3"!#m!!$-c*QC!,d!!-c-CQB![J!!c-`c-`#r!!$-c!!!!-!!!*Q
+Crrm!`3!!QCR-c!$#!!#CN!3!``!!QCPQCJ$%!!#CQ6-c!-8!!*QC!!!!aJ!!CQE
+rr`$(!!"QCXc-!-J!!'CQQCN!b3!!CT!%!-S!!'CQ!!!!b`!!CQBc-`$-!!!c-rr
+r!-d!!$-cc-`!cJ!!-c1CQ3$2!!!c-fCQ!0!!!$13"!$4!!!c-`!!!0)!N!6rr`$
+6!*!%c-`!e!#3"*QC!08!N!4QCJ$@!*!%-c-!eqlZ!*!&f0hG!*!&fEZl!*!&fUU
+U!*!&fiL)!*!&h(Gh!*!&h999!*!&hN4%!*!&hb)L!*!&i"%4!*!&i3!!lZi!!!$
+L!!$Gh3!!!1-!!,Zl!!!!j!!!UUS!!!$P!!#)L!!!!1B!!(Gh!!!!j`!!998!!!$
+S!!"%4!!!!1N!!#)L!!!!kJ!!%4%!!!$V!*!%lZi!l!#3"0hG!1d!N!5lZ`$Z!*!
+%UUS!l`#3")L)!2!!N!4hG`$a!*!%998!mJ#3"%4%!2-!N!3L)J$d!*!%%4%!pHk
+3"J$fhC!'!2HlN!B!q+U3"J$jL*!'!2ThN!B!qe@3"J$m4*!'!2dLN!B!rK'3"J$
+r!*!(!Z6F!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$
+r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$
+r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$
+r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$
+r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$
+r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$
+r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*#jr`!!!2m!!!$
+r!!!!r`!!!2m!!!$r!!!!r`!!!2m!!!$r!!!!r`!!!2m!N2m!N)`MN#X!N2m!N($
+r!2m!r`$r!2m!)j",!2m!r`$r!2m!r`#3r`#39L13A`#3r`#352m!!!$r)j"a!!$
+r!!!!r`#3r`#30L13I`#3r`#3+[m!r`$r!#13L`$r!2m!r`#3r`#3(L13P`#3r`#
+3&2m!!!$r)j#K!!$r!*$r!*!-)j#V!*$r!!$r!2mMN,Ar!2m!N2JMN,d!N2$r!!!
+MN-Ar!*$V)j$,!*$Mr`!MN0-!r`#3h#13f3#3e[m!)j$I!*$5)j$P!*$+r`!MN1X
+!r`#3a#13m3#3`513pIm!N,XMN2X!N,Ar!#13r`$r!*#a)j$r)j!%!*#Yr`!MN2m
+MN!J!N+XMN2mMN!`!N+Ar!#13rb13%!$r!*#K)j$r)j!8!*#I)j$r)j!B!*#F)j$
+r)j!D!*#Brb13rb13([m!N*8MN2mMN#!!N*-MN2mMN#3!N*!MN2mMN#B!N)cr!#1
+3rb13+!$r!*#+)j$r)j!U!*#*)j$r)j!Zr`#3K513rb13-!#3JrmMN2mMN$,r!*#
+")j$r)j!d!*#!)j$r)j!fr`#3IL13rb130J#3IL13rb131!#3I#13rb131J#3H[m
+MN2mMN$S!N(SMN2mMN$`!N(Ir)j$r)j!qr`#3GL13@2mM)rmMN"2r)j!)rb13"[r
+r)rmM)rmMN,F!N(BMN&Rr)b2r)j!Frb13"ImMN!Er)j#i!*"e)j!irrrr)j!(rrr
+r)b2r)rrr)b2rrb-M)rrrrb13"2mM)rmMN!6r)rrr)j!%rrrr)j!%rb-Mrb2rrb-
+Mrrrr)b-Mrrrr)rmM)rmM)b2rrb13X`#3G5130rmM)b2r)j!&rb-M)rmMrrmM)rr
+r)b2r)rmM)b2r)b-Mrb-Mrb13"2rr)b2r)b2r)b-Mrb-M)rmM)rrr)b2r)rmMN!A
+r)b-Mrb-Mrb-Mrb-Mrb13XJ#3G5131[rr)j!&rb13"ImM)b2r)b-Mrb13"2rr)b-
+Mrb-Mrb13"2mMN!6r)j!%rrmM)b2r)b2r)b-Mrb2r)j!&rb-M)rmM)rmMrb13"2m
+MN,%!N(2r)j!jrrmMrb13"[rrrb-Mrb-M)rmM)b2r)b2rrb2r)b-Mrb-Mrb13"2m
+MN!6r)b2rrb2r)b-Mrb-Mrb-M)rmMrb13"ImM)b2r)b2r)rq3"L13XJ#3Fb1312m
+M)b2r)j!*rb2r)b-Mrb-M)rmMrb-M)rmM)b2r)b2r)j!%rb13"2mMrb-M)rmM)b2
+r)b2r)b-Mrb2r)j!&rb-M)rmM)rmMrb13Y`#3F[mMN$Mr)b2rrb13"ImM)b2r)rm
+M)b2r)b-Mrb2r)b2rrb-M)rmM)rmMN!6rrb-Mrb-Mrb-MrrmM)b2r)b2r)b-Mrb2
+r)j!&rb-M)rmM)rmM)rmM)rmMN,2r!*"b)j!jrrmM)rmMN!ArrrmM)rmM)b2r)b-
+Mrb-MrrmM)rmM)rmM)rmMN!6r)rrr)j!%rrmM)rmM)rmM)rmM)b2r)b2rrb-M)rm
+M)b2r)b2r)b-MrrmMN,3!N(,r)j"Lrb13hJ#3Fb13B[mMN0i!N(,r)j"Lrb13h[m
+!N()MN2mMN%)!N(3MN2mMN%!!N(8MN2mMN%!!N(8MN2mMN%!!N(8MN2mMN%!!N(B
+MN2mMN$lr!*"f)j$r)j!q!*"i)j$r)j!m!*"k)j$r)j!k!*"krb13rb131J#3I#1
+3rb131!#3IImMN2mMN$Er!*"q)j$r)j!f!*#!)j$r)j!d!*##)j$r)j!b!*#%)j$
+r)j!`!*#')j$r)j!Z!*#)rb13rb13+J#3M#13rb13+!#3MImMN2mMN#Er!*#2)j$
+r)j!N!*#4r`!MN2mMN#!!N*BMN2mMN"i!N*Mr)j$r)j!Dr`#3Qb13rb13'!#3Rb1
+3rb13&!$r!*#K)j$r)j!3!*#Pr`!MN2mMN!`!r`#3U513rb13#!#3Vb13rb13"!$
+r!*#a)j$r!*#er`!MN2X!r`#3ZL13p3#3`2mMN2%!N-BMN1X!N-Rr!2mMN1Ar!2m
+!N-mMN0m!N0Ir)j$C!!$r!*$E)j$6!*$Kr`$r!#13b`$r!2m!N1JMN-8!N2$r!!!
+MN,hr!*$k)j#e!*$r!2m!r`!MN+X!r`$r!*$r!*!,)j#K!*$r!*!Ar`!MN*F!!!$
+r!*$r!*!J)j#,!*$r!*!Ur`$r!2m!)j"r!2m!r`$r!*$r!*!h)j"a!*$r!*"(r`!
+!!2m!)j"I!!!!r`!!!2m!N2m!N&JMN%X!N2m!N'Vr!2m!r`$r!2m!r`$r!2m!)j!
+V!2m!r`$r!2m!r`$r!2m!r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3TAB!!!"f!!!
+!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"f!*$r!*#0)j!S!*$r!*#
+-GL13+!#3$hB!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"
+f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ#3r`#3,51
+3+!#3%&@36`#3r`#3,ABMN#J!N!pf9C"2GJ#3r`#3,513+!#3%&@36`#3r`#3,AB
+MN#J!N!pf9C"2GJ#3&RB!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!
+!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!
+!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"f!*#P)j!S!*!39C"2!*!B6*"
+`!*#NGL13+!#3$hC9N%pf!*!@GNb3F!#3T513+!#3%&@36`#3'%b3F!#3T(BMN#J
+!N!pf9C"2GJ#3&RC-N(!!N+8MN#J!N""9N%m!N"K-N(!!N+4f)j!S!*!2GP@36hB
+!N"Cf6*"`!*#P)j!S!*!39C"2!*!B6*"`!*#NGL13+!#3$hC9N%pf!*!@GNb3F!#
+3T513+!#3%&@36`#3'%b3F!#3T(BMN#J!N!pf9C"2GJ#3&RC-N(!!N+8MN#J!N""
+9N%m!N"K-N(!!N+4f)j!S!*!2GP@36hB!N"Cf6*"`!*#P)j!S!*!39C"2!*!B6*"
+`!*#NGL13+!#3$hC9N%pf!*!@GNb3F!#3T513+!#3%&@36`#3'%b3F!#3T(BMN#J
+!N!pf9C"2GJ#3&RC-N(!!N+8MN#J!N""9N%m!N"K-N(!!N+4f)j!S!*!2GP@36hB
+!N"Cf6*"`!*#P)j!S!*!39C"2!*!B6*"`!*#NGL13+!#3$hC9N%pf!*!@GNb3F!#
+3T513+!#3%&@36`#3'%b3F!#3T(BMN#J!N!pf9C"2GJ#3&RC-N(!!N+8MN#J!N""
+9N%m!N"K-N(!!N+4f)j!S!*!2GP@36hB!N"Cf6*"`!*#P)j!S!*!39C"2!*!B6*"
+`!*#NGL13+!#3$hC9N%pf!*!@GNb3F!#3T513+!#3%&@36`#3'%b3F!#3T(BMN#J
+!N!pf9C"2GJ#3&RC-N(!!N+8MN#J!N""9N%m!N"K-N(!!N+4f)j!S!*!2GP@36hB
+!N"Cf6*"`!*#P)j!S!*!39C"2!*!B6*"`!*#NGL13+!#3$hC9N%pf!*!@GNb3F!#
+3T513+!#3%&@36`#3'%b3F!#3T(BMN#J!N!pf9C"2GJ#3&RC-N(!!N+8MN#J!N""
+9N%m!N"K-N(!!N+4f!(B!GJ"f!(B!GJ"f!(B!GJ"f!(B!GJ"f!(B!GJ"f!(B!GJ"
+f!(B!GJ#3$hC9N%pf!*!@GNb3F!#3r`#348b3F!#3r`#34(C-N(!!N2m!N%9-N(!
+!N2m!N%4f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!
+!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ!
+!!(B!!!"f!!!!GJ!!!(B!!!"f!!!!GJ#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#3r`#
+3r`#3A846493!!!"8!!$rr`!!!#i!5!!"!!!!!J!!!%X!!!$%m`"rrrrrIrrrr`"
+65'J!!!!"!*!4!3!"!*!&!5qL!*!-!9S!!!"J!!,rr`!!!#S!!!!#!*!4!3!"!!!
+!@"0),k)!N!`"@J#3%3%!!3#3"3%!@J#3$!%'!*!84Nj863#3"%099&-!N!4%8e9
+0!!!!*J#3$`i08'9bCQpbE@%J9A0PFJ#3#%K%6NN!!!!'!!"69&P-!!!"%!!(rrm
+!!!!F!%!!!908@8`!@"A8!J%!@"@`!*!&@"A3!&J9a!"B&GJ!@"B3!&J9Y!"B&E`
+!N!J"Y3!!rj!%!!!!"`!#rrm!!!!*!*!%"!S!!Iq3"!#3#[rr!!!!!J!"!!)%!J!
+!rrm!!!!#!!%!!3!"!!(rr`!!!!%!!J!%"!S!!Irr!!!!!`!"!!%!!J!#rrm!!!!
+"!!-!"33+!!(rr`!!!!%!!3!"!!%!!rrr!!!!!3!%!!B%#J!"rrm!!!!%!!%!!3!
+#!!6rr`!!!!%!"3!(!!%!!2rr!!!!"3!"!!-!!Iq3"!!!!!%!"J!)"!N!!Irr!!!
+!!3!"!!3!!Irr!!!!1J!(rrm!!!!'!!3!!8K"8dL3!%9cP3!"TFLabJ!!YY+ccJ!
+%`0+c``!#b0ApcJ!$!"FPH!!'!3kQA!!&!!!!MJ!'rrm!!!!8!!S!!N0)39)!@"A
+)!($rr`!!!!%!!Irr!*!)$!%!N!8#!*!&!Irr!*!%$!(rr`!!!!%!!!!&!!(rqJ!
+"!!!-!Irr!!!!!3!!!"B!!IrV!!!!!3i"rrm!!!!"!!!!)J!"rpm!!!!#$!(rr`!
+!!!%!!!!"!!(rrJ!#!!!-!3!!!#i!"Irr!!!!"J!%!!&)390)!!)"#`!"!!)"$`!
+%!!)"%!!$!!-"#`!#!!3"#`!&!!!!2J!#rrm!!!!8!!S!!N0&6%`!@"A-!!$rr`!
+!!!%Ir`!!!!)!N!Mrr`!!!!B!!"rr!!)!N!XF!!,rr`!!!!B!"!!"5%&65!!#(rm
+!!5!"!*!(MJ!&!!)!!3!B!!S!!NG58%J!@"B8!!$rr`!!!!%"r`!!!3!"!!!#!!)
+!N!Err`!!!!3!!!(r!3!"!!!#!!)!N!ErN!B!"!(l!3!"!3!#!!)!N!Err`!!!!%
+!"J(j!3#"@!!#!!)!N!Err`!!!!%!%3&Z!!!"!!!#!!%!N!NS!!6rr`!!!!B!"!!
+"5%&65!!6!Qm!"!%#!`%!!3%)Je-!!`-"!3)!N!3"@J!$rrm!!!"X!!S!!P*96&)
+!@"@i!!Vrr`!!!!%"r`#3C2rr!!!!"!!!!Im!N',rr`!!!!)!!J(p!*!%3!#3B#)
+!!rrr!!!!"J!%!!&)390)!!!"r`!"!Im!N!4!!J(p!!)!!!!L!!N!!3!#!!)!"!!
+#6%Y98!!!!!-!!Irr!!)!!`!%!!8!"J!!!-3!"Irr!!!!*!!%!!*138e&!!!%b,(
++S3#3(J)+b,(+SFV8bq1al3#3'!3%dV2$[!#3(J8%eIh1a!#3(JB%dV21XJ#3,0`
+!!rrr!!!!4!!%!!*'6P40!!!!!JG$D'PMB@G[!*!j!`!#"NGPEQ9fB3#31K8!!JP
+)C@afCA4TBf%!N$C&9%*-!!!!3%C19%d!![*X3e988`!#mR4%8e90!!,bI%K%6NN
+!![+U8e4C6!!#mV4&9%*-!!,j62rqrIclq[Rim2(bmr6ep[H3!1m!!!%!!!!"5!!
+!!%J!!!"D3Np#6d0A6&!$!*!A#R"KD@jd0#jMGfX!!J!!!%0A8&4#6d*2!*!+3eG
+39%*23Nm!N"M2Xq2!!*!'!D)!N!d[*3&#6d*25(P`D!)!N"ih*3&#6d*28&*&4J-
+!N"if*3&#6d*2C%0[E!%!N"J18'9bCQpbE@%J9A0PFJ#3"#,2Xq2!!!"35808!qJ
+!!Fqcim""GA4S9%9B9!2U!$3!N!F-#d0XBA*TFeG[FQYc!!!"!!!!!8J!!!")!!!
+!@J"B&*3Ai!!!!"`!@J!#9%9B9!!!!"T`EQpd!!!!*P088L!!!!!b!qVrr`#3#[r
+r!!!!%J"B%Ebrp2rr!!!!1!"B%H3S2J:
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/ClarisWorks_5.0.cwk b/writerperfect/qa/unit/data/draw/libmwaw/pass/ClarisWorks_5.0.cwk
new file mode 100644
index 000000000..84dae0471
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/ClarisWorks_5.0.cwk
Binary files differ
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/ClarisWorks_6.0.cwk b/writerperfect/qa/unit/data/draw/libmwaw/pass/ClarisWorks_6.0.cwk
new file mode 100644
index 000000000..371ed1410
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/ClarisWorks_6.0.cwk
Binary files differ
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/CorelPainter_10 b/writerperfect/qa/unit/data/draw/libmwaw/pass/CorelPainter_10
new file mode 100644
index 000000000..b90bfbdc9
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/CorelPainter_10
Binary files differ
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/CorelPainter_3_win.rif b/writerperfect/qa/unit/data/draw/libmwaw/pass/CorelPainter_3_win.rif
new file mode 100644
index 000000000..be59998c0
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/CorelPainter_3_win.rif
Binary files differ
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/CricketDraw_1.0.hqx b/writerperfect/qa/unit/data/draw/libmwaw/pass/CricketDraw_1.0.hqx
new file mode 100644
index 000000000..e94be3585
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/CricketDraw_1.0.hqx
@@ -0,0 +1,133 @@
+(This file must be converted with BinHex 4.0)
+:#f0bD@0VCA4%FQ&h!%0,4&4$8N4A!3!!!#*!!*!%a$J!!JBb,c8[1$F!N!Are2r
+m!DJ#3!!2!!!!5!")!*!%![!#32rarqi$#3*5B`)&+!2m!3!!!!&S!@J!N!31X!Y
+!!!%"!!"N!!%!!!!"!!)!!!!"*`m!!3#3$K!!N!N3!2qerkB2,3ZD!!J"!*!0'3%
+!!3!"!@N!!3%!!!%!!!!"!!!"!3'!!!(rr`)!!!#K)J!!!!J!!!!)!!!!#!!!!!J
+!!!%b!!%!!!&N!#%!N!6`+J!1!#%EZ3#3"3-!N"-)!!J!!J!#!*!G*!!!P0!!!3"
+UcMJ!DXeJ!'V0A2rr!'V0H+T9UP@U9DT9!!!!2!!!PD$jN!!!!)+!!*!%!H!#J!#
+3#8J!!!")!*!&#!!"!!J!N!9Uc@3!N!6qpJ!!!#!!!*6-!*!E%!!!P-J!N!X-!!#
+8a!!!rri!!!,X!!#8`!!+reIrb3(k!JRqpJ!!!YK`3#$C8d"ZqN(Zr[BJ#&+!,`!
+3,[lf!N!!rdM!,`![,IQ)UGj54`a(!'4[!2p3$'hrrrQ1Ea![,IQ)UGJ!DXh8!*!
+%!3#3"JB!!2rd!!$rmB!!!!`!!!!1J!!!!3!!!@3!)3#3"2!U!!i!)4Zj!*!&C"P
+,!*!*)3!!!"3!!!"N!!S!N!XK!"3!!*9`!*!%!H3!!!'UJ!#3#JS!!!!Y!%J!N!m
+J!!$rTJ!!!"d!!!!B!!!"f!!!!C`!!!(J!S!"&3!!!"3!!*9`!!`!!2raJ!!!$!!
+!!!k!!2rd!!!!$S!!rr3!!2raJ!!!DXi-!'V1-!#3"`B!!2re!!$rlS!!!!X!!!!
+4J!!!!3!!!@3!)3#3"2!U!!i!)4Zj!*!&C"P,!*!*)8M!JH`!'!"N!&i!N!XK2`D
+TC5mY!*!%!GJ!!!&UJ!#3#Y!!!!!Y!%J!N!mJ,`crTJ!!!#-!!!!@!!!"c3!!!9N
+!!%KS!!J[$+R63UG#Tbm-!!X!!2rZJ!!!#`!!!"'!!2re!!!!%B!!rr8!!2rZJ!!
+!DXhN!'V0e!#3"`B!!2rcJ!$rp`!!!!b!!!!*!!!!!3!!!@3!)3#3"2!U!!i!)4Z
+j!*!&C"P,!*!*)3#3"f3!N!dK!*!+!F5!!!%f!*!2,3")!*!2)!!!rkB!!!!5!!!
+!'3!!!EJ!!!%Y!*!4$)!!rrF!!!!-J!!!#3!!rr1!!!!*!!$rmi!!rrF!!!"UcL!
+!DXi-!!!!!3!!!!8!!2rfJ!$rk3!!!!Q!!!!A!!!!!3!!!@3!)3#3"2!U!!i!)4Z
+j!*!&C"P,!*!*)3%j!3J"13"N!$N!N!XK!3S"1J%0!*!%!FH!!!$p!*!,1`!!!#d
+!5!#3$b"rr`#&!#J!+J"R!'Prr`#'!#F!+!"T!'Trr`#)!#B!*`"U!'[rpS!!rqN
+!!2rfJ!!!&`!!!!Q!!!!A!!!!#B!!rqN!!!"UcQ!!DXhN!!!!!3!!!!3!!2riJ!$
+rl`!!!!H!!!!4!!!!!3!!!@3!)3#3"2!U!!i!)4Zj!*!&C"P,!*!*)3!!!H!#J!"
+N!*!0)3(J!S!!F`#3"!($J!!!Z3#3$bd!5!#3$b!!#J!!!!S!N!3"i!+!!%F!!!!
+8!!#9F!!+!*!%!H!#J!"(rrL!!2r[!!$rq)!!!"%!!!!(J!!!%3!!!!H!!2r[!!!
+!DXfX!'V1)!!!!!%!!!!$!!$rp!!!rr!!!!!-!!!!%!!!!!%!!!&N!#%!N!6`+J!
+1!#%EZ3#3"@3C5`#3#5%!!*9F!!S!C!#3$5'9F!!+!*!'!F-!!!#(!*!2,3")!*!
+2)!+!!*!&&!!!PA!!#J#3"!(J!S!!N!88!!#9F!!+!!$rp!!!rr!!!2rd!!!!%!!
+!!!`!!!!3!!!!$!!!rr!!!!"UcNJ!DXjJ!*!(!J!!rrm!!2rQJ!!!!3!!!"Q!!!!
+"!!!"C!!K!*!%m#S!$J!K'lN!N!9N'8X!N!NK!4B"$J%@!'3!&`#3#b%"%!%B!3B
+!N!3"a!!!!%#!!*!+'3!!!#d!5!#3$a!"'`%#!4X"!`%E!4-"'`%8!4`"!3%F!3)
+"(!%8!4`"&3%G!3!!!3!!rqD!!2rr!!!!'B!!!'V0d!"UcD`!N!F#!!$rrJ!!rqX
+!!!!#!!!!&3!!!!%!!!&N!#%!N!6`+J!1!#%EZ3#3"@3C5`#3#5%!N!GN!*!0)3%
+E!5m!r3#3"@d!!!&Z!*!,-!!!!#d!5!#3$a!"-J%!!6)"!3%b!48"-J%@!6-"!3%
+c!3)"-`%8!6-"&3%d!3,rrJ!!rqX!!!!#!!!!&3!!!'V1&!"UcNJ!N!F#!!$rqJ!
+!rqJ!!!!'!!!!'!!!!!%!!!&N!#%!N!6`+J!1!#%EZ3#3"@3C5`#3#5%")!$q!5!
+!C!!J!*!,)3%D!5%"'`#3"8!!!!&`!*!,)`!!!#d!5!#3$a!"*!%H!58!p`%P!2J
+"*3%H!58"(`%Q!2B"*J$h!5B"(`%Q!5!!"J!!rqJ!!2rk!!!!'!!!!'V1Q!"UcG!
+!N!F#!!$rpi!!rpi!!!!)J!!!)J!!!!%!!!&N!#%!N!6`+J!1!#%EZ3#3"@3C5`#
+3#5%!N!GN!*!0)3#3#b1!!!&Q!*!2,3")!*!2%!#3$J5-!5N"J!%T!Ad"+3&q!5N
+"IJ%T!B!!#)!!rpi!!2rhJ!!!)J!!!'V13!"UcK3!N!F*!!(re)!!rp-!!!!VJ!!
+!,3!!!!%!!!&N!#%!N!6`+J!1!#%EZ3#3"@3C5`#3#5%!B`"VIrm!C!!k!*!,)3!
+k!(!!F`)!!!!"9)!!!E)!N!Yc!!!!,3")!*!2U!"V!("rr`&@!$m!4`"M!'Yrr`&
+A!%F!BhrrIrm!!!!J!6)"&J!6J!$re3!!!"D!!2r9!!!!(i!!rp8!!!!UJ!$reJ!
+!!#Z!!2rG!!!!)i!!rqm!!!!FJ!$rp`!!rrk!!!!E!!$rjB!!!#S!!2r9J!!!,3!
+!rp5!!!!I!!$reB!!!!%!!2rCJ!$rl3!!rqD!!2rN!!$rli!!rpX!!2rdJ!$rd`!
+!rrL!!2rA!!!!!i!!rq!!!!!2J!$rjJ!!!!L!!2rM!!$rmi!!rpB!!!"UcQ`!DXk
+B!*!(#3!!rq'!!2rp!!!!(S!!!!-!!!!"!!!"C!!K!*!%m#S!$J!K'lN!N!9N'8X
+!N!NK!5`"(3%Y!'3!,3#3#b%!q`%Z!2d!N!3"ES!!!@i!N!X[!!!!,3")!*!2+!%
+a!3!!!!)S!6%"'!%b!3!"-J%"!6)"&3%b!4B"-`%"!6-"![rKJ!$rr3!!rq1!!2r
+p!!!!#B!!rrd!!!!GJ!!!!3!!!"k!!!!$!!!!DXiX!'V13!#3"``!!2rRJ!$rl3!
+!!"L!!!!6!!!!!3!!!@3!)3#3"2!U!!i!)4Zj!*!&C"P,!*!*)3!"!!%!!3"N!)F
+!N!XK!Cd"L3!"!*!&m)!!!E3!N!mY!%J!N!mJ!*!P')!!rrN!!2reJ!!!%`!!rqH
+!!2rY!!!!#)!!rrJ!!!"UcT`!DXjX!!!!!3!!!!S!!2rXJ!$ri)!!!"1!!!!IJ!!
+!!3!!!@3!)3#3"2!U!!i!)4Zj!*!&C"P,!*!*)3#3"f3!N!dK!2N"*!%G!*!&X)!
+!!DL!!*!1,3")!*!2)!!&!!!"I`'!Irm"(!&m!Ad"J!'"Irm"(3&k!A`"J3'$Irm
+"([rXJ!$ri)!!rqb!!!!IJ!!!%i!!!"q!!!!6J!$ri)!!!'V2T!"UcL`!N!F,!!$
+rh)!!rq@!!!!MJ!!!'S!!!!%!!!&N!#%!N!6`+J!1!#%EZ3#3"@3C5`#3#5%!!!!
+8!!!!C!!+!*!,)3!8!!#9`!#3"9b!!!'JJ!#3#JS!!!!Y!%J!N!mJ!!!"D!!+!*!
+&&!!!PF!!#S!"J!&rrhrr!*!&&!!!PJ6rh)!!rq@!!2rFJ!!!'S!!!#1!!!!DJ!!
+!)i!!rq@!!!"UcS!!DXkF!!!!!3!!!!8!!2rmJ!$rl3!!!!1!!!!6!!!!!3!!!@3
+!)3#3"2!U!!i!)4Zj!*!&C"P,!*!*)3+!!*!&C!#3$5%!N!88!*!%!9#!!!%i!*!
+2,3")!*!2)!!+J!'!!ArrIrm!N!9%!*!8rrb!!2rY!!$rr)!!!"-!!!!$J!!!%`!
+!!!1!!2rY!!!!DXjd!'V2T!!!!!%!!!!&!!$rq!!!rq'!!!!)!!!!(S!!!!%!!!&
+N!#%!N!6`+J!1!#%EZ3#3"@3C5`#3#5%!N!GN!*!0)3#3"!(J!*!%!93!!!$bJ!#
+3#S!!!!!Y!%J!N!mJ!!!!&!!!PI!!#J#3"!(J!S!!N!88!!#9m!!+!*!%!H$rq!!
+!rq'!!2ri!!!!(S!!!!J!!!!HJ!!!#!!!rq'!!!"Ucf!!DXk!!*!($J!!rpi!!2r
+G!!!!)J!!!#-!!!!"!!!"C!!K!3S"1`%0!$X!)3%l!3X"1`"N'8X!N!NK!!%"L3)
+*!'3!N!dK!BN##3&+!*!%!6+!!!#aJ!#3$Ld!5!#3%`)!#J!"!!%"L3)*!D8!!!!
+8!'V2#!"Uc[!!!3'*!JN"T3"Uc[!!N!3"!!!"!!!!"3!!rrZ!!2rTJ!!!")!!!"D
+!!!!"!!!"C!!K!*!%m#S!$J!K'lN!N!9N'8X!N!NK!!!!&!!!!'3!#J#3#b%!&!!
+!PI!!N!8G!!$rp!#3#`S!!!!Y!%J!N!mJ!!!"i!+!!DB!!!!8!!#9m!!+!*!%!H!
+#J!!m!!!!&!!!PI$rqi!!rqQ!!2rlJ!!!&S!!!!5!!!!@J!!!")!!rqQ!!*!'DXm
+)!3!!!3!!!!3!!2r[J!$rhB!!!"#!!!!LJ!!!!3!!!@3!)3#3"2!U!!i!)4Zj!*!
+&C"P,!*!*)3#3"f3!!`#3#b%!!!!"J!#3"Ir[!*!6,3")!*!2)!!+!!!!#J#3$Mm
+!N!rrli!!rpf!!2r[J!!!)S!!!"#!!!!LJ!!!%)!!rpf!!*!*!3#3'J%!!!&N!#%
+!N!NK!*!(C"P,!*!*)3#3"f3!N!dK!*!EE3!!!#d!5!#3%2riU+d3(fFS-#i!#*!
+!E[ri)'hjK#"35-#"k!!B,`"#CbmYqA`!DXp8!'V1G!!!!!%!!!!&!!$rqi!!rq'
+!!!!%J!!!(S!!!!%!!!&N!#%!N!6`+J!1!#%EZ3#3"@3C5`#3#5%!!!!8!!!!C!!
++!*!,)3!8!!#9m!#3"!&4J!!!9)!!N!S+!!!!,3")!*!2)!!!!H!#J!%L!!!!&!!
+!PI!!#J#3"!(J!S!"@!!!!"3!!*A`rrZ!!2rKJ!$rqi!!!"k!!!!%J!!!(S!!!!5
+!!2rKJ!!!DXlS!'V2B!!!!!%!!!!(!!$rq!!!rr8!!!!)!!!!#`!!!!%!!!&N!#%
+!N!6`+J!1!#%EZ3#3"@3C5`#3#5'!+J#!J%m!C!#3$5%!DMQ)!!S!N!3"(J!!!DF
+!N!Ym!!!!,3")!*!2)%0)!PN!N!F+!!!!$!!+FN`!!!!+!!!!$!!+FN3!!!L!rrJ
+!N!X,!!!!#!#3#[re!!!!DXkX!'V29!!!!!%!!!!(!!$rq)!!rr8!!!!(J!!!#`!
+!!!%!!!&N!#%!N!6`+J!1!#%EZ3#3"@3C5`#3#5%!)#KY!!-!C!#q!*!,)@ld3QF
+r2!#3"!%KJ!!"IJ#3#i`!!!!Y!%J!N!mJqPK2l`!1B!!,PNUYmKTQ8N*R5'lqM%k
+Y0'*FMdKi!$C1V3@DrrL!!*!+#`!!!!H!!*!*rr8!!!"UcZ3!DXlS!!!!!3!!!!F
+!!2rd!!$rli!!!!`!!!!3J!!!!3!!!@3!)3#3"2!U!!i!)4Zj!*!&C"P,!*!*)3%
+(!3J"$`"N!2m!N!XK!6S"#3%+!*!%!5)!!!&(J!#3#JS!!!!Y!%J!N!mJ!!!"i!+
+!!*!&&!!!PI!!#J#3"!(J!S!!N!88!!#9m2rd!*!,%)!!!!`!N!Vrli!!!'V1[!"
+UcU`!!!!"!!!!"`!!rq`!!2rTJ!!!&!!!!"D!!!!"!!!"C!!K!*!%m#S!$J!K'lN
+!N!9N'8X!N!NK!*!(C!#3$5%!N!S"*`!!!3U!!*!1,3")!*!2)!#3*2rX!*!,&S!
+!!"3!N!VrkB!!!'V2K!"UcZ3!!!!"!!!!"!!!rqq!!2rGJ!!!%)!!!#+!!!!"!!!
+"C!!K!*!%m#S!$J!K'lN!N!9N'8X!N!NK!*!(C!#3$5%!N!S"'S!!!%f!!*!1,3"
+)!*!2)!!+!!!!#J#3([r[J!$rhB!!rqq!!!!LJ!!!%)!!!#+!!!!3J!$rhB!!!'V
+1P!"UcV`!!!!"!!!!"!!!rr#!!2rFJ!!!$i!!!#1!!!!"!!!"C!!K!*!%m#S!$J!
+K'lN!N!9N'8X!N!NK1A`!TJ"U!'3!j`#3#b%!#%0)!PN!N!AUJ!!"FS!!N!iY!%J
+!N!mJ!!S!!!!+!!"rr`'D!M)#3(rr!DJ!H!)bIrprr`!!!"3!!*D3!2r`J!$rh)!
+!rr#!!!!MJ!!!$i!!!#1!!!!2J!$rh)!!!'V1b!"Uci3!N!F1!!$r`J!!rj1!!!!
+q!!!!E)!!!!%!!!&N!#%!N!NK!*!(C"P,!*!*)3#3"f3!N!dK!*!,[)!!!2F!N!m
+Y!%J!N"-$!*!4DXlX!'V2)!#3#@V2+!#3"!%!!!%!!!!$!!$rl3!!rpm!!!!6!!!
+!)3!!!!%!!!&N!#%!N!6`+J!1!#%EZ3#3"@3C5`#3#5%!N!GN!*!0)3#3#bL!!!!
+B!*!2,3")!*!2)!#3*2rY!!$rh`!!rqd!!!!K!!!!%`!!!#%!!!!6!!$rh`!!!'V
+2)!"UcZ`"!!!"!!!!!`!!rqb!!2rB!!!!%i!!!#J!!!!"!!!"C!!K!*!%m#S!$J!
+K'lN!N!9N'8X!N!NK!*!(C!#3$5%!N!XU!!$r[!#3$bd!5!#3$b!!N#6rl)!!rpJ
+!!2rXJ!!!+!!!!"1!!!!S!!!!%i!!rpJ!N!GUcbJ"!!!"!!!!!`!!rpm!!2r'!!!
+!)3!!!$S!!!!"!!!"C!!K!*!%m#S!$J!K'lN!N!9N'8X!N!NK!!!!&!!!!'3!#J#
+3#b%!&!!!PY`!N!6rii!!!$)!N!X+!!!!,3")!*!2)!!!!H!#J!#3"43!!*EF!!S
+!N!3"i!+!!*!&&!!!PYcrh`!!rmB!!2rI!!!!1J!!!#%!!!!k!!!!)3!!rmB!N!S
+"!*!D!3!!!@3!)3#3#5%!N!GN'8X!N!NK!*!(C!#3$5%!N"YY!!!!,3")!*!3rrL
+SV4!ICbJ`,J!)N!"ZrrJJEIQ%)&")`)(S!"J[!%*R,bhjI!"UcfJ!DXk8!!!!!3!
+!!!-!!2rZ!!$rei!!!")!!!!SJ!!!!3c0"'3!)3#3"2!U"3i"94Zj!*!&C"P,!*!
+*)3#3"f3!N!dK!*!%!H!!N!AM!!!!6B!!N!U!!!!!,3")!*!2)!!!!"3!!*EF!!S
+!N!3"i!+!!#`!!!!8!!#@h!!+!*!%!H$rlJ!!rpH!!2rZ!!!!+)!!!")!!!!SJ!!
+!%J!!rpH!!!"Ucf3!DXl)!!!!!3!!!!-!!2rL!!$rd)!!!"i!!!![J!!!!6-c!9%
+!)3#3"2!U!!i!)4Zj!*!&C"P,!*!*)3#3"f3!N!dK!*!,23!!!2b!!*!1,3")!*!
+2)!#3*2rL!!$rd)!!rq)!!!![J!!!(J!!!#q!!!!H!!$rd)!!!'V21!"UcfJ!!!!
+"!!!!"!!!rqJ!!2rG!!!!'!!!!#-!!!!"-c3$B!&9!*!%m#TI$J&9'lN!N!9N'8X
+!N!NK!!!!-!!!!'3!!3#3#b%!9`"q!#m!N!@E!!!!5!#3$bd!5!#3$b!!#J!!!!S
+!N"lrk!!!rpd!!2rS!!!!)`!!!"J!!!!M!!!!'!!!rpd!!!"UciJ!DXpN!!!!!3!
+!!!%!!2rH!!$r`J!!!#)!!!!q!!!!!3!!!6)!)3#3"2!UC!i!)4Zj!*!&C"P,!*!
+*)3!!!"3!!!"N!!S!N!XK!"3!!*Dm!*!&V!!!!-3!N!X+!!!!,3")!*!2)!!!!#B
+!!!!H!!!!&!!!PV`!#J#3"!(J!S!!N!88!!#@[2rH!!$r`J!!rpi!!!!q!!!!)J!
+!!$i!!!!L!!$r`J!!!"aTE##1G'&TG#"eEQ8JCQpTFh0eF'9bFf0bDA"d!!B!N!8
+9!!3!H!#3"33!N!88!!#@[!!+!*!%!H!#J!#3"@V21!!!!!%!!!!)!!$rhS!5rmB
+!-`!KIqi!1Ir0!!%!!!&N!#%!N!6`+J!1!#%EZ3#3"!&I'%X!N!R0rpJ"Q!)B!'3
+!N!dK!@Crr`'C!*!&3(r[!'hrc3#3#Im!!!!Y!%J!N!mJ!!3#4RrrIrm!!!!%!*!
+%J!!!&!!!Pk3,9@jdDA4XC@3J)c(rhS!5rmB!-rrHJ")!1Ir0!#&rlJ!jrmd!)Ar
+ZrmB!-`#3#!%!N"S"!!!"C!!K!*!*)3#3"f3C5`#3#5%!N!GN!*!0)3#3'fd!!!!
+Y!%J!N"$rq+LY%"pR+$!Z!!L3!'lrq#"YqB3J8%M!JHJ!'#m!3QF[,IPm'e!!!!:
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/CricketDraw_1.1.hqx b/writerperfect/qa/unit/data/draw/libmwaw/pass/CricketDraw_1.1.hqx
new file mode 100644
index 000000000..fc6c016fa
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/CricketDraw_1.1.hqx
@@ -0,0 +1,72 @@
+(This file must be converted with BinHex 4.0)
+:!Q0N!%0,4&4$8N4A!3!!!"-B!*!%lA`!"!Fh,c)b,cJi!*!%rp6rr!'X!M`!$`!
+!!%J!5!#3"!,`!N$rmIrZ!`N#8Q-#"5J$r!%!!!!"D!&S!*!%$V!,3!!"!3!!C!!
+"!!!!!3!#!!!!!5F2!!%!N!i3!*!*%!$rYIqQ$bd,QJ!)!3#3$4N"!)N!33)!!!%
+!!!!"!!!"!!%#!!$rr`!K!*!(#!!!!!J!!!!)!!!!#!!!!%J!!3!!!@3!)3#3"`%
+!)3#3"`-!N!9)!!!!5!#3#3J!#!!#!!)!N!X%%3!!!!44!*!%N3#3"&%!!!!%83!
+!!!%4!!!!"&%!N!44!!!!5+*+F"!!!!1F!!!!"mi!!!!$MJ#3")i!!!!(MJ!!!!1
+1!!!!!3i!!!!$MJ!!!!11!!!!ja`%!*"S)!#3"#!!N!3J!*!%)!#3"#!!N!3J!*!
+%)!#3"#!!N!3J!*!%)!#3"#!!)!#3"#!!!!"Q#d3!N!6ri)!!rmi!!!!IJ!!!-J!
+!!3J!!!%6!!!"4`!!!AF!N!m$!!!!%!!"!!!"C!!K!*!(!3!K!*!'!@3C5`!+!!!
+!#!!!!#%!N!GN!)F!N!XK!*!+!5H!!!&&!*!,L3!!!#d!2!#3"b!!LJ'C!)X"M3#
+,!Bi!L`'A!)X"Q!#-!Bi!M!'2!)`"P[rJJ!$rcJ!!rq#!!!!b!!!!(i!!!$)!!!!
+IJ!$rcJ!!!'B-)!"Q#FMrjS!!rpf!!!!CJ!!!)S!!!3J!!!#T!!!"1`!!!1i!N!m
+$!!!!%J!"!!!"C!!K!*!(!3!K!*!(C"P,!*!*)3#3"J0F#!!!Y!!!J!$rq)!!!)N
+!N!S")B!!!-Z!!*!1,3!m!*!()!#3%fBB#!#3#[rQJ!$rhB!!rqD!!!!LJ!!!'B!
+!!#+!!!!CJ!$rhB!!!'B,k!"Q#d6rl3!!rq8!!!!6!!!!'`!!!,8!!!&M!!!!f`!
+!!CN!N!m-!*!&!3!!!@3!)3#3"`%!)3#3"f3C5`#3#5%!N!GN!)!!N!XK!*!,b!!
+!!Ai!N!S#!*!%,3!m!*!()!#3')!!!43!!!#3!!!5!!$rkJ!!rrd!!2rP!!$rl3!
+!!!3!!!!6!!!!'`!!!'B,i!"Q$#$rmB!!rr-!!!!1J!!!$3!!!,B!!!%Z!!!!d`!
+!!8J!N!m,!*!&!3!!!@3!)3#3"`%!)3#3"f3C5`#3#5%!N!GN!*!0)3#3#m5!!!%
+l!*!2,3!m!*!()!!!!@J!#J!m!!#(!!!X!"N!!`(D!N)!'3!$!N&rr`!Drr'!!2r
+c!!$rmB!!!!d!!!!1J!!!$3!!!!k!!2rc!!!!CJ[B!'B,k2ra!!$rkS!!!!m!!!!
+9J!!!Y3!!!1S!!!$6!!!"&3#3$`S!!!!3!!%!!!&N!#%!N!F"!#%!N!GN'8X!N!N
+K!*!(C!!i!*!,)3#3#m3!!!$rJ!#3#L!!!!!Y!$`!N!FJ!!8!!+!U-$J#)'B5,b`
+!(UQU-$J+B'B'2b`!#+QCB4$rm3!!rqU!!2ra!!!!&B!!!!m!!!!9J!!!$`!!rqU
+!!!"Q#L`!CJ[Jrq8!!2rB!!!!'`!!!#J!!!#p!!!!M!!!!2-!!!$F!*!2#3#3"3%
+!!!&N!#%!N!F"!#%!N!GN'8X!N!NK!*!(C!#3$5%!N![B!!!!Y!#3$bd!2!#3"lJ
+!#J#3"!(J!S!"M!!!!"3!!)AJ!!S!N!3"i!+!!)X!"!!!rpN!!!!%!!$rf!!!!!)
+!!2rB!!$rq3!!rqS!!2rc!!!!#!!!rrS!!!!G!!!!$3!!!#F!!!!@!!!!+!!!!"F
+!!!!Q!!!!&J!!!#B!!!!-!!!!*`!!rq`!!!!8!!$rj3!!!!8!!2rq!!!!#!!!!!N
+!!!!*!!!!#`!!!!J!!!!1!!$rq!!!!"!!!2re!!!!&`!!rr8!!!!D!!$rp3!!!"X
+!!2rf!!!!'J!!rrB!!!!A!!$rp3!!!'B,d!"Q#pMrjS!!rq!!!!!CJ!!!)!!!!-`
+!!!!c!!!!r`!!!(-!N!m)!*!&!3!!!@3!)3#3"`%!)3#3"f3C5`#3#5%!N!GN!(m
+!N!XK!*!,jB!!!&-!N!Z#!!!!,3!m!*!(+!#$!BS!J`',!)-"QJ#$!CX!K!'*!)3
+"LJ#%!CX!K!'Frr#!!2rX!!!!'B!!rq!!!!!3J!!!#J!!rqD!!!!J!!$rji!!!!S
+!!!"Q$13!CJSXrqD!!2rJ!!!!'B!!!#!!!!$%!!!!+`!!!2F!!!"V!*!2#!#3"3%
+!!!&N!#%!N!F"!#%!N!GN'8X!N!NK!*!(C!"r!*!,)3#3#pf!!!",!*!,JJ!!!#d
+!2!#3"bJ!J`'+!)-"L`#$!CS!J`'E!)3"L3#%!BS!K!'E!)3"R2r`J!$rl!!!!"Q
+!!2rJ!!!!%)!!!!S!!2rQJ!!!)!!!rqH!!!!+!!!!CJ[)!'B,d2re!!$rpJ!!!!X
+!!!!+!!!!H`!!!BJ!!!#4!!!"R!#3$`F!!!!3!!%!!!&N!#%!N!F"!#%!N!GN'8X
+!N!NK!*!(C!#0!*!,)3#3#iB!!!'5!*!,N!!!!!!Y!$`!N!FJ!*%"&3#4!5d!N3%
+Z!*)"&3#5!4J!NJ%V!*)",3#6!4Mrp3#3#`S!!!!,!*!+rrB!!!"Q#JJ!CJcNrr-
+!!2r`J!!!$3!!!!q!!!"l!!!"63!!!*8!!!&X!*!2"J!!!!J!!3!!!@3!)3#3"`%
+!)3#3"f3C5`#3#5%!N!GN!(d!N!XK!*!,L!!!!9b!!*!+J!!!!#d!2!#3"b!!L!"
+D!!!!'J!!!"m!!!#9!!!"63!!!3i!L`%2!)X"-rrc!!$rm)!!rr-!!!!2J!!!$3!
+!!!q!!!!0!!$rm)!!!'B-L!"Q#mMrkpLmrl'km`!8*d3!6N8-!(4B[!#BGHF!R+G
+%!68!N!m1!*!&!3!!!@3!)3#3#5%!N!GN'8X!N!NK!*!(C!"f!*!,)3#3#iL!!!$
+QZ[3!N!Pj!!!!,3!m!*!,!`"k!0-!I!$k!(`!q`"p!0%!CJbB!'B-G!#3!!$5!'B
+-T!#3"2r`J!$rki!!!!q!!!!8J!$rl)!!!#9&$!!,J!!!6N8-!*!0"3!!!")!!3!
+!!@3!)3#3"`%!)3#3"f3C5`#3#5%!N!GN!*!0)3#3#[rm!!!!1F8-!*!0,3!m!*!
+()!!+!*!%!H!#J)5%!!!!&!!!KH!!#J#3"!(J!S!r1Ir`J!$rki!!rr#!!!!8J!!
+!$i!!!"5!!!!2J!$rki!!!'B-G!"Q$*MrlS!!rqX!!!!4J!!!&3!!rqb!!2rU43`
+!$i!!!"4&$!#3$33!!!!5!!%!!!&N!#%!N!F"!#%!N!GN'8X!N!NK!*!(C!#3$5%
+!N!VrrJ!!rrp&$!#3$5d!2!#3"b!!#J!!!!S!!!!+J!'!!ArrIrm!N!88!!#&i!!
++J!(rlS!!rqX!!2rZJ!!!&3!!!"'!!!!9!!!!%B!!rqX!N!GQ$+6rm)!!rr-!!!!
+2J!!!$3!!rq[B[2qaZ[-!&#G%rpM2*3#3$3-!!!!5!!%!!!&N!#%!N!CF!3"&!*!
+(C"P,!*!*)3#3"f3!N!dK!*!1rm9&$2rG!*!,,3!m!*!()!#3)2r`J!$rm`!!rr#
+!!!!0!!!!$i!!!!d!!!!2J!$rm`#31`)!!3!!!@3!)3#3"m`!)3#3"f3C5`#3#5%
+!N!GN!'i!N!XK!*!Ef!!!!#d!2!#3##"I8%p1d%j@!!!JEJ!)%""Q%$mm!!C1V3@
++)'i!#"#m!'B-!!"Q#JMrr)!!rpD!!!!$J!!!+B!!!*J!!!!N!!!!R`!!!(F!N!m
+#!*!&!3!!!@3!)3#3"`%!)3#3"f3C5`#3#5%!N!GN!*!0)3#3"J%!N!5EJ!!!6B!
+!N!iY!$`!N!F3!*!K!i!!rpD!!2rmJ!!!+B!!!'B+Y!"Q$)MrjS!!rm@!!!!CJ!!
+!1S!!!$8!!!"3!!!!D!!!!-8!N!m"!!!!%!!"!!!"-J!K!*!'C!%!)3#3"f3C5`#
+3#5%!N!GN!*!0)3#3#dk!!!#+J!#3#J%!!!!Y!$`!N!FJ!!!!'J!!!"l$QJ!"!*!
+2-!!!KD6rjS!!rm@!!2rQJ!!!1S!!!"Q!!!!kJ!!!'B!!rm@!!!!36'8JG'9iG'8
+JCA0d)'PMD3!'!!!-!!!9!!3!FJ#3"33!N!3"V!)m!!%!!!!`!!#'E!!X!*!&CJ`
+!rqD!!2rJ!!!!'B!!!#!!!!$8!!!!1`!!!3F!!!"l!*!2#!#3"3%!!!&N!#%!N!F
+"!#%!N!GN'8X!N!NK!*!(C!"r!*!,)3#3#qf!!!"E!*!,JJ!!!#d!2!#3"bJ!J`'
++!)-"L`#$!CS!J`'E!)3"L3#%!BS!K!'E!)3"R2r`J!$rl!!!!"Q!!2rJ!!!!%)!
+!!!S!!2rQJ!!!)!!!rqH!!!!+!*!l!J!"!!!"C!!K!*!(c!!K!*!(C"P,!*!*)3#
+3"f3!EJ#3#b%!N"[B!!!!,3!m!*!))&p36dl36PB!!#"Z!!J3%'B32c`!"NkY"BS
+JEJ!)%,cq2`!!:
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/FreeHand_1.0.hqx b/writerperfect/qa/unit/data/draw/libmwaw/pass/FreeHand_1.0.hqx
new file mode 100644
index 000000000..3eab3b19e
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/FreeHand_1.0.hqx
@@ -0,0 +1,75 @@
+(This file must be converted with BinHex 4.0)
+:"'CbC@8!B@0Q-f&MB6-"!!!!%"d!N!4P[Q&MCM-!"3"N(P!@J"l`&qJ!N!93!,3
+!!J!!!!S!N!S,6'&cCA*AFQPdCA)!N!8r)dVrrJ&k!!-!N!B'6'9dG'9b9&*6!!0
+,IJ"!53J!#HcH!$mNJJ!r69)!2`!!!!-!N!@d!!!8NJ#3$632S3#3"3)!!!!$!!3
+!"3!'!*!&F!qL!*!0%!!(!!J!#3!+!!X!$!!0!!i!$`!3!"%!%J!6!"3!&3!@!!!
+!*!!#!!!!%!!&!*!&&`!B!"N!'J!E!!!!(!!#!!!!%!!$!*!&(!!G!"i!!!!`!!)
+!!!!3!!J!N!8I!#!!)3!L!#-!*!!P!#B!!!!i!!)!!!!3!!S!N!8R!#J!+3!U!#X
+!,!!Y!#i!,`!`!!!!-"%b!*!&C!#3#4F!-30Q%U)-j!`k!*!(C"%d!*!&C!#3#a`
+!!!!%!!!!#3RP&N3*j4C%#m3@T!!!!!N3D"D($H-@eK$#&'3!!J!*$hm4$`lJ%Sm
+2ja!6!!!!#4%2$k!4&3qG%3m2S!!!!$34-3#3"@3!N!Xb#S`Dp"21&F)!N![#%!B
+!N!9N!*!,,!!-!!!!"rb!!!`!!!!-!!!!"J!!!!eAJ!!09i!!$9H!!!`!!!!-!!!
+!$!#3"4B!N"N,C'CRC!eLEQ*fGQ)2S!Z)%TJ*U!3*!!%!N!X"!*!6!3!!!!%!!!)
+!!!3!-`!I!"J!!2rrrri!N!8"!$-!(`!B!!$rrrrq!!8!!3!"!$-!)!!B!!$rrrr
+q!!N!!!!"!*!&!QTi!$`!+3!,!*!(-"%b!*!&C!#3#c3$K!V`#*J'`J#3"c34-3#
+3"@3!N!Xe#S`+#Jmm"IS!N!@-!)`!!!%N%63!N!9N!*!,0J!!!"!!!!!*"#X%E33
+V"'d$X39L!!)!#3+E#JF"M!L&!kF,J`!#!!N(d!eT"L8-X`Ip$A`!!J!*#h80c3U
+c$Sm0f3YN!!!!#3dR!PJ+933i$5F#@!!!!!N88!i3&&!1%!bc$`#3"!Rpk``F"&8
+0PrpV#T`!!J!*"!N&r3'#"L`(h`@c!!)!#3ZA#&8)j`E6$FF*N!!!!!!*%E818a!
+h#eB4Y3j6!!!!#3H[#H8(V`RP#3)(NJ!#!!N5A!GX$a!&V"BM#@d!!!!*'T!!$VF
+A)``N'T!!$VF!!!!*!5crR!%Xrj`#3`&!!!!!#33V!PJ#X`(#""N#KJ!!!!N$k!0
+"!qJ#c32S!d%!!!!d%6%!!!!("Q%JEQpdC3"N!!%!N!NG%IJG,K8f'B)!N!Xd%6%
+!N!9N!*!*'!!h!))9I!C!$T)!N!Xd%6%!N!9N!*!*1!!j!MS0+JJ@"2B!N!Xd%6%
+!N!9N!*!*'3!k$T),9"5d"!B!N!Xd%6%!N!9N!*!*'J!l$5S6*"-N$i)!N!Xd%6%
+!N!9N!*!*'`!m"p!9'!bH%!3!N!Z1%!B!N!9N!*!(#2rr!"6rr`#3"3J!"UX!!!`
+!N!8%!*!(!R3a$qB#!"#K!4!%#3!"!*!,!3#3$a3!!!!"!!!!!3!!!3%!!J!c!"m
+!'!!!rrrrrJ#3"3%!N!FL!!*UH!!#!*!(1"!&!!!!"`CK)'j[G'8!C!#3#6d!!!!
+`!!%!N!X"!!!!#J#3#!8%%63!N!9P!*!,(3!!!%i!!!!*!TX4P!+E%C3#Qa8d!!)
+!#3S(&6N(!KFk#iX80J!#!!N0L`bK#S8,V4$c$E3!!!!*&,3CC"+9&D`3QKPN!!)
+!#3Lj'(X-+KNd#$dBB3!#!!N&H"H4"EFArJ6Z&U3!!J!*"685'35E%d`&GK'9!!)
+!#3V`%)N*63qJ$2!4TJ!!!!N1%"Hc$B38Y!i3&l-!!!!*"%`6!`4-%`-%[a+2!!)
+!#3ER%3m''a$p#+d413!#!!N0LaF-$3d@P!mS'*3!!!!*%GFDda"$'6m1MaPY!!)
+!#3R%&SF-q4J@"[J9+J!!!!N$Ba'e""!9*30M%E8!!!!*"AJ6C`9i%fF&H!pH!!)
+!#34-#4d%NJdM"$%(KJ!#!!N&h!2S!iN$D`J5"&i!!J!*#6m)Q!K&"T!!#QX,"`!
+!!!N-j!qJ$"-163aU$6m!!J!*#a%(M3UQ#I!,3`C[!!)!#4#*"CN1X!6N&2`(5`!
+!!!NCK4-N&a)2$"BM%eN!!J!*$Hm6!a&2%e3+"4+Q!!)!#3F)$8J'a"%f"aX-,3!
+#!!N18`Y8$%`+%K'k$A!!!!!*&(%AN40P%P83B"IT!!!!#3GX%Tm)M"D-#QJ4E3!
+!!!N0V"CP$4i6QJXl&jm!!!!*"X8AF!R4&ld'BK86!!)!#3Mm%E8'"K&+#r-5)!!
+#!!N)GaLp#TSB'3,C'QX!!!!*"EX2i`-"%TJ&Z`rM!!!!#3d&(VX0"4kl#Q8Fq`!
+#!!N&04G2"K!D9`42&#N!!!!*#*J51`F3%bB)Q")l!!!!#3kh(VX1Yakl$6SFM3!
+#!!N+M"PN$%mE@JR,')d!!J!*"p!@U!Jl&l8(KKAZ!!!!#3Lj%X!)C"2%#6)8"3!
+!!!N+m"9m#fN9l!NE%68!!J!*#,N*a!MJ$[i)S`Dq!!)!#3Zi!TX)aJ(R$R!$3!!
+#!!N4e`RP%'X)$4)M#NJ!!J!*&082S"Bl$8S6Za&i!!)!#3ia$P-1-`j8$*X0IJ!
+#!!N)G`FT"Si+Y!LT"XX!!J!*$$d&Q3VF"-X1qJFa!!)!#4-N$Hm4CJY,%hi1H3!
+#!!N88")C&2)43"0G%ed!!J!*$8J5`!mR%`3,1"*e!!)!#3DN%#8(Va'*"6B123!
+!!!N)r![C#!3-LJZc$LB!!!!*%)NB@4#*%ei02"KC!!)!#3RP&ZX,i"LX##-9@3!
+!!!N+ca$Y#884cJa@%Z8!!!!*$M%B[3ia&3),`KLp!!)!#3Mm&#m*LKB+#+J6&3!
+#!!N)f`pr"li36JSG$T3!!J!*$--4-!bG%3`1j40"!!!!#4'e',d4'48,$r!AS`!
+#!!N1-45d$h3@A!a)%M-!!!!*#e30*`Y8%,%2KJdR!!!!#4(i&!d4q!rE$488$3!
+!!!N+m!cN#[!4aa!5$%)!!!!*%Z%9R41J%(d3A"@G!!)!#3ia%fF2cK5F#bN4)J!
+!!!N)%`[C#1B3#!UH#pN!!J!*$T82I`cV$KB1Q3q#!!)!#4'8&&!5dK,E$ii@V`!
+#!!N-Aa0&$@X8D`R"%'8!!!!*"dX+V3Ic$`))1`TH!!)!#3Y8#S`+(JRQ$5%,J3!
+#!!N18`lB$B)-qJq6%EB!!!!*%3m@C4"r%e%,qKCP!!)!#3H0%KN*`K@$"c`4R!!
+#!!N&h!k9"C`28JAc$N`!!!!*"N!1f!C$$ZF'3!lB!!!!%K$0!*!&2J!J!*!%%K$
+0!*!&2`!K!*!%'"$3!!!!#2q3"!!8!!!!3!!J!#!)V!)!N!38%0%!N!9"!!!!(`!
+!!")3c`#3"8)%F'pcG!!!!"`3cJ!!!!J!!3!@!!J!!!"$!#!!+J!"!&N!#J)"!!!
+!("$1!*!&4!!P!!!!*M1B!!X"!*!%%K$2!*!&434`FQpM!!!!(""U!*!&4J#3"`%
+"`J!"!!!!&K"V!*!&4`!Irrm!!!!@%'X!N!9)!"p!!*!%(""U!*!&5HCQ!*!'!F)
+!!3!!!"`3DJ#3"8T#Mb6G)pF!!!(#!!%!!!!F%'S!N!9,c-bc-`#3"!(#!!%!!!!
+@%'X!N!9-!#)c-`!!!"`3DJ#3"8fVK3#3"J(#!!%!!!!1%C8!N!F"!Y!!!!!3%C8
+!N!F#!&!!+!!!!"!4P3#3"`)!+!!S!!!!%"'9!*!(!J!8!"3!!!!3%C8!N!F#!!S
+!#J!!!"!4P3#3"`)!&!"3!!!!&"'9!*!("!"i!"3!&!!8!!!!'"'9!*!("J"i!"3
+!&!!8!"3!&!!!!"34P3#3"`3!&!!8!"3!2!!!!"!4P3#3"`)!qJ"Z!!!!("$1!*!
+((`!!!!2G'`!+!*!&("$1!*!((`!!!!2G'`!+!*!&#J!$"94TE@9c!!!!("$1!*!
+((`!!!!2G'`!+!*!&("$1!*!((`!!!!2G'`!+!*!&("$1!*!((`!!!!2G'`!+!*!
+&("$1!*!((`!!!!2G'`!+!*!&%K$0!!!!#!!#rrm!&!#3"4m!N!3F%-i!N!FI!!!
+!!pdE!!S!N!8F%-i!N!FI!!!!!pdE!!S!N!8F%-i!N!FI!!!!!pdE!!S!N!8F%-i
+!N!FI!!!!!pdE!!S!N!8i$k)!N!d#!%i!6`!!!!`!!`GbC@4'D@aX!!!!$3!$#'G
+bBAP'D@aX!!!!$3!$#'GbB@4QD@aX!!!!$!!$"h*KC'CTE'`!!!!0!!-)F'pcG%C
+TE'`!!!!+!!-&E'PZC6%!!!!+!!-&E'PZC6)!!!!*!!-%F(*[B`!!!!S!!`9#E'&
+MD`!!!!J!!`0bC@3!!!!,!!-'Ch*KH6)e!!!!#J!$"9*PC$N`!!!!$`!$#NKeC6*
+--M"6-c!!!!!2!!-+Bc)`E6-`H6%`-!!!!"!!!`YbC@3j-&4TER3b-!!!!!i!!`P
+cF'pd8Q9N0MF!!!!d%6%!N!9N!*!,8!)k(#!'AK8f!*!&M!#-!!!!1"!&!*!&C!#
+3#9%!!!3*!!%!N!X"!*!0("$1!*!((`!!!!2G'`!+!*!&1!qL!*!0!J"5!&-!!!!
+d%6%!N!9N!*!,9!'Z(3B(*KKq!*!,0"%a!*!&C!#3#e8)0"ZH$Bi@lJ#3"B`!M!!
+!!"`3cJ#3"bB!!!!$h4X!#J#3"4`3cJ#3"bB!!!!$h4X!#J!!rj!%$kS!!!:
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/FreeHand_2.0.hqx b/writerperfect/qa/unit/data/draw/libmwaw/pass/FreeHand_2.0.hqx
new file mode 100644
index 000000000..c887895d6
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/FreeHand_2.0.hqx
@@ -0,0 +1,49 @@
+(This file must be converted with BinHex 4.0)
+:"R4PFh4f-J"'5%3b4NK"-J%!!!!-)`#3"!Z(4NK%-J!*!!!H8"D!([!Ak!#3"9!
+!Y!!!%2m!N!3",!%X!!S!!!"N!!)!N!Gl!*!&Y!!!"dGPEQ9bB@`!N"J'6'9dG'9
+b!*!ESjm!N2Xi%iN!!J!$!!3!"3!'!!F!#!!*!*!2@"1+!*!&%!#3&a!!#J!,!!`
+!$3!1!!m!%!!4!")!%`!8!"8!&J!A!"J!'3!!!#J!"3!'!*!&'J!E!"`!(3!H!"m
+!!!!m!!8!#`#3"5!!)3!L!#-!*!!P!#B!*`!S!#N!+J!!!"J!"3!#!*!&+`!X!!!
+!%!!&!*!*+!!&!!B!N!8Y!#i!,`!`!$%!-J!!!"`!"3!$!*!&-`!d!$8!!!!i!!8
+!#J#3"6B!0`!i!$N!1J!l!$`!23!q!$m!!!!`&4d!N!9N!!!i!!B!N!3J!#X!N!3
+%ZK,+$l38(J!!!$!9(3"!!!!!C!!!B!!)!*!%)3!V!*!&2!e)"[i2-J!!!$`9'3#
+3"@3!!$J!(!#3"%%!3J#3"!Ni%#)30JXL!!!!'J!r!!$b$[rrV+J!!&0B!!$b$[X
+qjPJ$fXU%!*!(2"8C!*!&C!!!F!!`!*!%)J"#!*!%!Ii++!Ti"*)!N!Xi&4S!N!9
+N!!!1!$!!N!3M!%)!N!31L!Qk%rB&8!#3"cJ9'J#3"@3!!!B!$!#3"#3!3J#3""&
+f%XS9QJq-!*!(1"8D!*!&C!!!$!!"J!!!!#3!3J#3"!hb(+`4BKV@!*!(2"8C!*!
+&C!!!"J!B!*!%*J"#!*!%%Yi00"EZ#P!!N!Xm&4N!N!9N!!!'!!B!N!4$!%3!N!3
+4fK5J&V)61!#3#cJ9'J#3"@3!!'!!!J#3"#F!3J#3"!(U&Ti%9K4D!*!(2"8C!*!
+&C!!!-!!#!*!%43"'!*!%"HB9p!L1&4J!N!@-!)`!!!!m&4N!N!9N!!!B!!)!N!3
+T!%)!N!3+[KAJ$I)8S!#3#c!9(3#3"@3!!'!!$!#3"#3!,!#3"!3"%*3'aJfp!!!
+!1"2Y!*!&C!!!I!!$J!"(!!!%#3!"!*!,!3#3$6`9'3#3"@3!!'!!(!#3"#S!-`#
+3"G)4-!EU#U!!N![q%qi!N!9N!!"J!!'!!*!(!J#3"!'[!LBGGJH4'r!!!!3*!!%
+!N!X"!*!+!3#3"'!!!!#F!!!!hJ!J!#"rr3#3"8J!$!!!!!d!N!8#!"m!!!"k!"X
+!&J!A!)8!!!!$!!!!!J!!!!%!!2rr!!!!%3!!rrB!LUl!!!NQh!!#f53!$3!!!"J
+!!2rf!$#U`!!**Y`!!YNN!!d!!!!I!!$rpJ!`UX!!#5EF!!,C*!!0!!"TE##1G'&
+TG#"eEQ8JCQpTF`eXD@jP)$)0E'PZC5!c$3!!!"i88J"*!*!(!3(#!!%!!!!H&&)
+!5KQC'CNc-`!!!F)!!3!!!"i88`",Xc+c-V-b!"T-c!!!!"i88J"-rj!%!*!%!F)
+!!3!!!"i88J"0rrm!N!B"`J!"!!!!(K46!%lrrmc,c-X!(M-c!!!!&K5e!%m!N!8
+F!*!&("66!&!!N!8D%5*%L"%L4)J!!!!F&,F!83#3"4`!!!U-!!)!!!!8&-N!8J#
+3"("[Fh3!!!!H&,J!8`#3"a`!N!N@&,8!9!#3"4`!!3!!!"`8d`"9!*!&'c0Qc*N
+cCXbC!!!!&K5e!&B!N!8H!*!&("5h!&F!N!8H!!!,i!!#!!!!("5h!&J!N!8I!"i
++M!!"!!!!4"6G!&N!N!9D!*!+e(S!!0F+!"i!+!,3"!N!!3#3#`%!N!dI&-S!@`#
+3"'aTEQ8JF'pcG(0MFQP`G!!!!#)8YJ"F!*!&(`!j!!2G'`!+!*!(&K5e!*!((`#
+3"4`8Y`#3"am!!!U-!!%!!!!F&0-!N!FIrj!)!!!!%"6*!*!*(K5i!*!*(`#3#83
+8h3#3%3%!!!!"!*!)"!N!!3#3#`%!N!dL&,B!N!FI!!!!!pdE!!S!N!FN&03!N!F
+Irj!)!!2G'`!+!*!&%"6+!*!*%K9p!*!(!3,3!!!!&"9p!*!(!J"3!#J!!!!8&Ad
+!N!F#!#J!+!!!!"39I3#3"`)!&!!8!!!!&"9p!*!(!J!+!!S!!!!8&Ad!N!F#!"3
+!8!!!!"J9I3#3"`3!H!!8!"3!&!!!!"`9I3#3"`B!H!!8!"3!&!!8!"3!!!!B&Ad
+!N!F%!"3!&!!8!$`!!!!8&Ad!N!F#!2S!EJ!!!!`6L`!!!!F'B5"ZEh4P!!!!("5
+h!*!('`!!#Fi!!3!!!#)8YJ#3"a`!!!!$h4X!#J#3"a`8d`#3"adcCXbC-fE-Q3!
+!!#)8YJ#3"ad!!!!$h4X!#J#3"a`8Y`#3"am!!![J!!)!!!!L&,B!N!FI!!!!!pd
+E!!S!N!FJ%iS!N!83!*!A!J"G!&i!!!!3!!B(3Qp[DfeKEJ!!!!i!"J9#E'&MD`!
+!!!m!"JCjC@aXEhF!!!!4!!B)G'PZG'GbBAN!!!!4!!B)H@9XE&4bG@8!!!!-!!B
+$FQ9N!!!!$J!'"A*PC$)`!!!!%J!'#@CTE'`JG'PZG!!!!"!!"JG`BA4dCA*Z!!!
+!%3!'#'GbB@4'D@aX!!!!%3!'#("[Fh4'D@aX!!!!%`!'#R*KC'PKE%CTE'`!!!!
+@!!B0G'9cG%pfCA*3FQPZG!!!!"%!"JK`BA4dCA*Z-J!!!"!!"JGbC@4'D@aX!!!
+!%J!'#A*PC$-`0%a[C`!!!"!!"JGbC@4(FQ&N!!!!$J!'"@GSCfKR!!!!)"1+!*!
+&%!#3&`)!A`"J!!!!$J!'"A"[Fh3a!!!!$J!'"@aTEQ8b!!!!1"8D!*!&C!!!F!!
+$J!!!!#!!B3#3"!1X(+`**"F#!*!(2"8C!*!&C!!!$!!$!*!%*3!V!*!%$')DAK-
+D&XB!N!Xi&4S!N!9N!!"`!!1!!!!!)!"L!*!%!k`FV!NN&`)!N!Fm&4N!N!9N!!!
+-!!-!N!3P!#X!N!3-BKTH%aS@aJ#3#am8bJ#3"QaTEQ8JF'pcG(0MFQP`G!!!!"m
+8bJ#3"QaTEQ8JF'pcG(0MFQP`G2q3",[C!!!!:
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/MacDraft_1.0.hqx b/writerperfect/qa/unit/data/draw/libmwaw/pass/MacDraft_1.0.hqx
new file mode 100644
index 000000000..d5d2b7a24
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/MacDraft_1.0.hqx
@@ -0,0 +1,134 @@
+(This file must be converted with BinHex 4.0)
+:$A4PFh46D'&`C5jYC'B!4&*A4de%4P3"!!!!iC!!!*!%S,%!!J!!!!)#BJ*L!!!
+!9"'Xr%#-B!"8%I3!!!"8$T`!9"&N!&314!"8$N3!!J#3"!G96Nj"689%6PEpmNM
+R!aK#Tcmm!3ZTZLKI3UFr2!%0!&34p!!!!!%!N!6Irrrr!*!%lYIrr`#3"*h9[rm
+b)N!!rZlrr`3!!)!!!!Ir!*!%prhrr`#3"2q3"!!)!!$lEErr!*!%lEDrrb!!!!$
+Yf[rr!*!K"3J*!BN+"`'-#JX"MJS-!C!!#Ji"NJJ5!C-!N"!"4!!+!9)!$!#3"%c
+58bf@@8Dc!"%!#rq3#!!J!!3!N!8"!!%!N#X"!!%!N!8"!!%!!!!"!!!6!"85r`)
+#!3!1!!8!!J#3"`%!!3!"!!!!!3%"!"!!3J%3!8)!N!3AJ")!!!%!-!!`!3&rrhr
+rJ!'!!3!!!8!"3!!"!!,ljrrCrqF$f3#3'2r*!*!%rrm!!!!"!!%#3!(m!"3!!3S
+!"43SC-L3"#L3##+3"&@3"!!!!!%!!3*!!I`!&!!"#J!&&#KNb*!%+*!))T!%9C!
+%!3%!!`"N!3!"!!!"!!)!!3!)!!B!"`$J!"!"!*!&!3#3#!%!!3,`!N!!9!fd!!!
+!!`#3"Z*k!!!!9!j`!*!&!`!#!!!!!J!#!"i!9!kJ!2!!9"(N!!8!"Iq3#!#3#4i
+!9"(`!2!!9!kJ!!8!"Iq3#!#3#4i!9"))!2!!9"(`!!8!"Iq3#!#3#4i!N!A`!&3
+5#!!&!!ArN!J!N!X`!&34q!#3"!4!(!!,#8!!"X!$B!YN#I`!N!J&p!,k#JX)cJ"
+8%@J%)!AJ!$!!9"(J!&342)4!(!!*#8!!#0`$B!V8"4!!N!J(i!-!#D!%J!"8%2!
+"`!'!!%B!N!Li3"S!#3P!!!MF!f!+e!83#'!$!*!+B!$!!!B!!!!J!1!!!!&!!1!
+!S!'!rk!"B2q!!)!!!!!J!!!!-!"8%9`!N!5%3"`!#3P!!!RB"RJ,C!L8!*!)#-!
+&`!SJ"k!!9!rJ!@!"i!!S!*!)R%!D!!N*3!!*f!Ci#f3)P!M!"F!!N!J"B!(J!!!
+!-!#3"9343)4!(!!*#8!!"X!'-!K-#I`!N!J'!!@!"f!)i!"8%HJ"B!0J!#J!9!r
+i!*!%R%!D!!N*3!!'`!B`#!3)6!B!"B!!N!J")!(J!%B!N!98%Ibi3"S!#3P!!!E
+N#%`)6!Rm"L!(B!#3#D!!`!!'!#!!S!$J!!!"3!$J!+!"J!!!!@!!!!$J!#!!S!#
+3"8)!9"&J!*!%$%!L!!N*!!!!b!%2!9m#J!%(!2%!N!6rU`!!!$%"5!#3"4!$$!!
+#!!!!!3!'!!&ZEh*YB@`J8!"#!&32Z!#3"!a!)J!*#3!!!0!$4!&R"*`"$J1!!*!
+%rk[rC`!a!*N!N!9I!``"!J!!!!%!"J!"Bf9ZG'9b!!!!33"8%I`!N!3-3#)!#3P
+!!!$J"4N"G`BS!4`&!*!&rk[rL!!a!(N!!!"j!!!$$2m#!!!!!3!&!!&bD@GSG!!
+!!$)!9"(X!*!%4%!L!!N*!!!"q!%J!IJ$'!(!!3#3$1!!!3#3"J(!!$)!9!mS!*!
+%5%!L!!N*!!!"q!3i!aJ%1!(!!m!!N!Q!!!!!!3#3"!%!N!3b!&321!#3"%K!)J!
+*#3!!!IJ&a!,d"F3"`!8J!*!*F!!!!!%!i!#3"c)!9!md!*!%4%!L!!N*!!!"q!D
+F!IJ(i!(!"H!!N!Z3!!!"!!!")!#3"6)!9!mN!*!%1%!L#!N*38S$T`%@!r!#Y3-
+J!3#3#N!!X!!"!*!&J!&J!$)!9!m8!*!%1%!L!!N*3!!$K!-m""3%A!-J!Z!!N!P
+!!)!!!3#!!*!%!3!!-J"8%d`!N!3i3#)!#3N!!!1%")!%J!8d!b!%!*!+F!"3!!%
+!!!#J!1!!!!!b!&32'!#3"$K!)K!*#8!!!f!&S!4F"J`$!!8!N!T`!$!!!3#3"H!
+!B!!b!&32(!#3"$K!)J!*#3!!!i3'9!4F"X!$)!@J!*!*B!!`!!%!`!"J!*!&-J"
+8$``!N!3i3#)J#3NK-306"Nm%4!LI!`!'B!&8$a!!N!9J!%!!!3$!!*!&J!!D!*!
++!``"!3!!!iF'6`3A#*m$"!!b!&32#!#3"$K!)J!*#3!!!m`)"!2`#,J$B!FJ!*!
+*%!"3!!%!)!#J!*!&-J"8$`3!N!3i3#)!#3N!!!2-#8J%&!SJ!f!)3!#3#5!!B!!
+"!!!!`!"!!!!!+!"8$`#3"44!)J!*#d!!"+)"a!81!T`%&J'2!*!*B!$!!#J!9!l
+m!*!%&%!L!!N*!!!%T!,d"4!$U!3J!U!!N!PJ!+!!+!"8$[J!N!383#)!#3P"$J5
+N")!&@!6X"%!$i!#3#@!!S!!S!&31p!#3""4!)J!*#3&H")d&r!9+"[-%)!9J!*!
+*J!$!!#`!9!lX!*!%'%!L!!N*!!!&S!&S"P3#L!8!!8!!N!QJ!3!!8!"3!#`!9!m
+J!*!%'%!L!!N*!!!&S!-m"P3%A!8!!Z!!N!QJ!3!!8!"3!#`!9!lS!*!%'%!D!)N
+*39i&CJ8""N8''J6J")!!N!QJ!1!!8!"3!#`!9!lN!*!%'%!L!)N*!93&3`EA"N3
+)@!6J"L!!N!Q!!8!!3!"!!$!!9!lF!*!%+%#+!!N*8!!'S`"3#%8$%3C!!@!"9!l
+JrkErjJ%D!9S!N!A!!8!!'J#3#6)$$2m"!!!(,!"3"l`#@!-%!$J!9!lB!*!%-%!
+D!)N*3!!'S!+-#@J&9!FJ!i!!N!6qa2l%!6`"2!#'rVi!N!AH!1B"2!!X!$B!9!l
+8!*!%3%!D!!N*!!!(#!U`"cm,(`C!#B!!N!NB!$%!!J!!!'-!-3#3"@-"0J"8$Y!
+!N!4!3"S!#3P#!!Fh#RF)J`af"Q-*3!#3#CS!m3"#!)!!B`#1!(-!R!#%!+N!P!#
+d!+8![3#f!-N!a`$D!0S!l3$Y!2B!rJ$V!3X!e3%A!,m"*3#S!6J!N3&0!)!"BJ"
+p!AJ!JJ'0!)8"SJ#&!EB!JJ(*!(X"e!"V!G!!93(%!%)"Y!!b!C`!)`&r!"F"C3!
+1!8i!"`%i!!S"*`!M!4i!4`%D!'N"&J#*!4F!U!%C!-3"&`$F!3i!m3$r!38!i!%
+A!+%"+!"3!5i!&`%I!!i""3!F!1m!+`$N!$d!h!"3!0-!DJ$(!*3!Z3$'!,!!mJ#
+b!43!Z3%a!,m"2J$%!5d!b3%,!-8!k`#[!-i!N3#a!)!!QJ#1!)i!UJ#(!,S!I`#
+[!(B!Q!"Y!)!!B`#b!&31c!#3"%"!'J!*#8+d#(i+JJR($()(JJP!!*!*R!$c!#%
+!J!"M!*`!K!#d!+8!b3$(!1d!l3$V!3X![`%P!*%"63"p!AJ!K3'L!))"b3"V!G!
+!3J'd!#-"I`!1!8i!#J%R!%F"'J#*!4F!a!%A!2%!r`%A!+%",J!A!38!(!$N!$d
+!d`"U!,N!aJ#b!43![`%q!-N"#`#[!-i!J!#D!+S!K`#[!(B!J!"M!#`!9!l)!*!
+%'%!D!!N*!!!,V!-m$$`&%!TJ!Z!!N!Q!!D!!3!"!!$!!9!l%!*!%+%!D!!N*!!!
+,3`@4$+8'm`TJ"3#3"IqMrr-!h3%Y!*!&J!%J!$J!9!l`!*!%-%!D!!N*!!!,L!H
+B$+3*"!T!"X!!N!6qV2kX!93"9!#+rq)!N!3"!!$J!)!"J!!S!&31`!#3""a!'J!
+*#3!!#iJ*f!aJ#f3+3!M!!*!*`!&J!$d!9!kB!*!%$%!L!!N*3!!+a`Zq#ei-$`R
+U#VJ!N!6rUrqi!$%!N!J$$2m#!!!!!3!"!!&KL'%!6J"8$V3!N!3-3#3!#3Y"$JR
+8"+X3mJBT#im('J#3"2q@qRi!kJ$5!!$pU"-!&4)"!J)"!!%!%J!"58`JMP4"593
+J98j&)%C2590#60m!0J"8$V`!N!4!3"`!#3P!!!Rr!(m,(`$m#1-!3!#3#B!!D!!
+#!3!!S!!!!$%"!!#J!$)!9!ki!*!%1%!F3!N*!!!**!%J#C!!![3))!%!N!S`!0!
+!!3"J!*!%!D!!-!"8$N3!N!3%3"`!#`Y!!!5*#$m*,3lErJ`%6!#3"!Ad![S+#`M
+1!&31V!3J"H!!-!"8$U3!N!5%3"`!#3P!!!DP#$m)R3R[!*!)"q!$!!QJ")!!9!k
+`!F!"J!"'!*!)Z%!D!!N*3!!'T3Jr#*d*l`KJ!`#3#Q!!`!!'!!!!)!$J!!!"3!$
+J!+!"J2qJ!@$rJ!#!!!!!)!!!!$!!9"(F!*!%K%!F!!N*3!!(S3YA#5d0F`#3#!M
+!"F!+)!HJ!&31U!&J!H!!+!#3#*a!'J!*#8!!"k%,9`NY$A-)`!A!!*!)!@!"i!!
+!!$!!N!L%3"`!#3P!!!5*#`m'&3lE!*!)"J!&J!GJ#1!!9"$8!@!$B!!S!&35!*!
+&R%!D!!N*3!!%L3X2"Fd0+`B!"B!!N!J")!(J!%B!N!Li3"S!#3P!!!5Y$5X'&3l
+E"L!(B!#3#D!!`!!'!#!!S!$J!!!"3!$J!+!"J!!!!@!!!!$J!#!!S!#3"6!!N!L
+)3!!!#`X!N!B@J"(r!!!!pJ#3"[m+%pJ1k3"8$N!6f!rI!$i!9!ii!&314-a!!!!
+,#`#3"J&3%Im!!2m+!*!)!5J2h`"8$M`!!3#3"5S#3!#3"5S#3!!q!&31-!"8$N$
+-3!!!#`X!!!&3!!!#S"(r!5Mr#J#3#!%S$pm!9!id!!%!+J!!!&3#3!!U!!!!9!*
+!!$i!9!iS!&311-a!!!!,#`!!!Tm!!!2`%Im#82m+!*!)!5N2h`"8$L`!!3"8!!!
+!IJ*!!&3!!!"q!N!!2J"8$L!!9!i`c%!!!!X,!!!$m!!!"8!4r`0jr`S!N!J"+!r
+I!&31*!!"!(i!!!#S!N!!IJ!!!+J#3!!q!&31'!"8$LM-3!!!#`X!!!9!!!!'N!!
+4r`5Kr`S!N!J"+!rI!&31(!!"!+J!!!$5!N!!U!!!!0)#3!!q!&31%!"8$L$-3!!
+!#`X!!!D2!!!(i"(r"FRr#J#3#!%T$pm!9!i8!!%!dJ!!!2`#3!$5!!!!r!*!!$i
+!9!i)!&31'-a!!!!,#`!!"q!!!!N`%Im'm[m+!*!)!5J2h`"8$J`!!3$m!!!"*J*
+!!2`!!!%Q!N!!2J"8$J!!9!i3c%!!!!X,!!!*-!!!#S!4r`JDr`S!N!J"+!rI!&3
+1"!!"!5B!!!&3!N!"*J!!!9!#3!!q!&30q!"8$JM-3!!!#`X!!!Tr!!!,d"(r#8,
+r#J#3#!%T$pm!9!hm!!%"8!!!!AS#3!&3!!!"HJ*!!$i!9!h`!&31!-a!!!!,#`!
+!#p!!!!dJ%Im+Drm+!*!)!5J2h`"8$I3!!3&k!!!"T!*!!AS!!!'N!N!!2J"8$HJ
+!9!hic%!!!!X,!!!0)!!!$R!4r`Z6r`S!N!J"+!rI!&30l!!"!D3!!!(1!N!"T!!
+!!Fi#3!!q!&30i!"8$I$-3!!!#`X!!!j[!!!2`"(r$,[r#J#3#!%T$pm!9!hN!!%
+"cJ!!!IJ#3!(1!!!"q!*!!$i!9!hB!&30k-a!!!!,#`!!$m!!!"%3%Im0j2m+!*!
+)!5J2h`"8$G`!!3(i!!!#)J*!!IJ!!!)L!N!!2J"8$G!!9!hJc%!!!!X,!!!4%!!
+!%Q!4r`m-r`S!N!J"+!rI!&30e!!"!L)!!!*-!N!#)J!!!N`#3!!q!&30b!"8$GM
+-3!!!#`X!!"*I!!!6X"(r%$6r#J#3#!%T$pm!9!h-!!%#6!!!!RB#3!*-!!!#GJ*
+!!$i!9!h!!&30d-a!!!!,#`!!%l!!!"8!%Im4AIm+!*!)!5J2h`"8$F3!!3*f!!!
+#S!*!!RB!!!+J!N!!2J"8$EJ!9!h)c%!!!!X,!!!9!!!!&P!4ra+&r`S!N!J"+!r
+I!&30[!!"!U!!!!,+!N!#S!!!!XS#3!!q!*!&9!h!c%!!!!X,!!!@6`!!&S!4ra1
+Yr`S!N!NV$pm!9!fd!!%#bJ!!!Y!#3!,+!!!#d!*!!*!)!F`!9!fm!!!!9!fd!!%
+!!)"9ccJ!5!,+!!!#d!*!!*$r!*#a#q`!9!h%!!!!9!fm!!%!!)"9`[`!5!+J!!!
+#bJ*!!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$E#q`!9!h-!!!
+!9!h%!!%!!)"9YX!!5!*f!!!#S!*!!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$
+r!*$r!*$r!*$E#q`!9!h8!!!!9!h-!!%!!)"9US3!5!*-!!!#GJ*!!*$r!*$r!*$
+r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$E#q`!9!hF!!!!9!h8!!%!!)"9RNJ
+!5!)L!!!#6!*!!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$E#q`
+!9!hN!!!!9!hF!!%!!)"9NJ`!5!(i!!!#)J*!!*$r!*$r!*$r!*$r!*$r!*$r!*$
+r!*$r!*$r!*$r!*$r!*$E#q`!9!hX!!!!9!hN!!%!!)"9KG!!5!(1!!!"q!*!!*$
+r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$E#q`!9!hd!!!!9!hX!!%
+!!)"9HC3!5!'N!!!"cJ*!!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$
+r!*$E#q`!9!hm!!!!9!hd!!%!!)"9E9J!5!&k!!!"T!*!!*$r!*$r!*$r!*$r!*$
+r!*$r!*$r!*$r!*$r!*$r!*$r!*$E#q`!9!i%!!!!9!hm!!%!!)"9B4`!5!&3!!!
+"HJ*!!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$E#q`!9!i-!!!
+!9!i%!!%!!)"991!!5!%Q!!!"8!*!!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$
+r!*$r!*$r!*$E#q`!9!i83UF!9!i-!!%!!)"95+3!5!$m!!!"*J*!!*$r!*$r!*$
+r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$E#q`!9!iF6Ud!9!i8!!%!!)"92'J
+!5!$5!!!!r!*!!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$E#q`
+!9!iN-#i!9!iF!!%!!)"9-#`!5!#S!!!!dJ*!!*$r!*$r!*$r!*$r!*$r!*$r!*$
+r!*$r!*$r!*$r!*$r!*$E#q`!9!iX!!%!9!iN!!%!!)"9)r!!5!"q!!!!U!*!!*$
+r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$r!*$E#q`!9!id)&m!9!iX!!%
+!!)"9&l3!5!"8!!!!IJ*!!*!'(J#3"Ai!N%%H!*!%!I`!N%%H!*!%!r!!N%%H!*!
+%"q!!N%%H!*!%(m!!N%%H!*!%2`#33Ki!N!6q!*"#(J!!!!(m!*"#(J!!!!I`!*"
+#(J!!!"rJ!*"#(J!!!$q!!*"#(J!!!(m!N%-H!!!!r!#33ai!!!(`!*"$(J!!"q!
+!N%-H!!!2`!#33ai!!"q!!*"$(J!!2`#34"i!!2`!N%3H!!2i!*"%(J!2m!#34"i
+!2q!!N%3H!(q!!*"%(J(q!*"&(JIi!*"&(KrJ!*"&(Rr!!*"&(rm!N%BIr!#34Kr
+`!*"'$m!!N2m!N2m!N2m!N&X,l!"8$Ma#E`"8$M3!!3!!J&8,H!")!#S!!!"8!N!
+!N!BH!*"((J#34ai!N%FH!*"((J#34ai!N%FH!*"((J#34ai!N%FH!*"((J#34ai
+!N%FH!*"((J#34ai!N%FH!!!Irrrri!#33"rrN!Em!*"!(rq3"`#33"rrN!IJ!*!
+r(rrrm!!!!$ri!*!r(Mr!!*!%"ri!N$mH"q!!N!3"r`#32ai"m!#3"6q!!*!q(J$
+`!*!&$i!!N$iH"r!!N!8(`!#32Ki2m!#3"32!!*!q(Jr`!*!&!m!!N$iH"q!!N!8
+$`!#32Ki!N!F$`!#32Ki!N!F$`!#32Ki!N!F(`!#32Ki!N!F2J!#32Ki!N!FI!*!
+r(J#3"hi!N$mH!*!'!I`!N$mH!*!'"rJ!N$mH!*!'2r!!N$mH!*!&!Ir!!*!r(J#
+3"32r!*"!(J#3"3Im!*"!(J#3"4rJ!*"!(J#3"6m!N$X,l!#3"2rr!&312!!"!!#
+!92mm!%J!N!8U!N!!N2m!N2m!N2m!N2m!N2m!N2m!N-`1!*"((`#34am!N%FH!*"
+((J#34ai!N%FH!*"((J#34ai!N%FH!*"((J#34ai!N%FH!*"((J#34ai!N%FH!*"
+((J#34ai!N%3H!&32M!!4!&31F#,B!!"-dP-YPPP'Xdc58ff@@8Dc!"i!N!8$!&3
+2M!&T!!!"!J3)%#"!J!%#4'J`-ND'!!!!H!!!!''dP!"KY)`!BE5)rrm!BE5FUP@
+U9DT9UP8!!!!JEh"d)'ecC`#3"!YQEh)JC@4TG'ecC`#3"`%F!'%RQ!!)!*!)rrf
+fh`4@D@9h#PT[EfdJ5@iJ0&J!-3!!#PT[EfdJ5@iJ-PJ!-J!!#eT[5DN!!!:
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/MacDraft_5.5.drw b/writerperfect/qa/unit/data/draw/libmwaw/pass/MacDraft_5.5.drw
new file mode 100644
index 000000000..5bb15fc08
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/MacDraft_5.5.drw
Binary files differ
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/MacDraw_0.hqx b/writerperfect/qa/unit/data/draw/libmwaw/pass/MacDraw_0.hqx
new file mode 100644
index 000000000..5265ebd9a
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/MacDraw_0.hqx
@@ -0,0 +1,9 @@
+(This file must be converted with BinHex 4.0)
+:"h4PFh3`,MN!4&*A4de%8PF"!!!!!VB!N!5f98e%!!3!N!82!!!!5!")!*!%![!
+#32rarqi$#3*5B`)&+!2m!3!!!!&S!@J!N!31X!Y!!!%"!!"N!!%!!!!"!!)!!!!
+"*`m!!3#3$K!!N!N3!2qerkB2,3ZD!!J"!*!0'3%!!J#3#8J!!!")!*!'!J-#!!0
+X!!%$!3%!!!%"!!(j!Y!#3!,3!N!#d!*!!*!&!3%""J!"!*$r!*"#"!!!!!)$!J!
+!'`!!!#d!!!"M!!!!K`!!"`!!!!)$!3!!B`!!!%J!!!#p!!!"RJ!!!3i!@JJ!!!!
+#!`%!N!4Z!#S!*3!!!%J!!!$'!!!!fJ!!!!J!aJ!!!&S!!!(lr[MlpI[jq[Vrq3$
+f#HJ8k4$`$rB2p`[q"`!&"J8'"`J%#!-(!Jd"$3!1r42m$rm*!!Elr[hjr[)&p!h
+i#[d)rJAr!rS!j2RIrI2pmrllr!d!N!3#!`)!HJ8!!!:
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/MacDraw_1.hqx b/writerperfect/qa/unit/data/draw/libmwaw/pass/MacDraw_1.hqx
new file mode 100644
index 000000000..54ed70ad0
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/MacDraw_1.hqx
@@ -0,0 +1,103 @@
+(This file must be converted with BinHex 4.0)
+:"h4PFh3a,MF!4&*A4de%8PF"!!!!4'd!N!6RFN459dG04!!'!!m!!!")!%J!N!3
+#m!*!rr(rlJ-*!P*M!J8S!r`"!!!!!@J"D!#3"!k`#d!!!3%!!'3!!3!!!!%!!J!
+!!!%R$`!"!*!1%!#3#4!!rlArTJmY#jS!#!%!N!dC!3#3#8J!!!")!*!'!J-#!!0
+X!!%$!3%!!!%"!!(j!Y!#3!,3!N!#d!*!!*!&!3%""J!"!*!5$J!8!!"%63#3#!'
+j!!!#2!!!+YF!)5V0!!i!!!!@"pFQF#Cb#lF(d!#3r`#3"3F!!!!#!`%!!'-!!!"
+)!!!![3!!!Ci!!!%1!&S)!!!!!J-"!*!%EJ!U!#8!!!")!!!!aJ!!!0S!!!!)!-B
+!!!"D!!!"qrliqrAlqIVkrrN!pJRS&1N3m!rf$rF,rJF!"3B&"JF)"!J$"`)0!3d
+!$[d6r!rr#3!'qrlpqIlb"I30q!Vp#2i&r`2k!16jhrhcrI2qqr`0!`!!!!)$!3!
+"$J!!!(i!!!#d!!!!f!!!#3!!!!)$!3#3"$`!"3"D!!!!r!!!!,d!!!&a!!!!#3#
+p!!!")!!!!&S!!!$m!!!!@J!!!38!!!"q!!!"F3!!!+X!!!&@!!!"!!!!!J-#!!"
+L!(`"!3-"!3!!%3$D!&B!k!#UD@`JMR4KDA3JG@jP)'C[DA-)!!!!!J-"!*!%*!!
+&!3%!!!!f!!!""`!!!$X!!!%)!38!!!!f!!!&!2[m!!8"!3F!!!!#!`%!!-B!!2r
+6!!!"$J!!!'-!!!"D!&S(!!!!!J-"!!$U!!!!@J!!!5!!!!%J!!!!@J"D!`!!!!)
+$!3!![3!!!!N!!!!5!!!#0`!!#3!!!!)$!3#3"$`!"3!5!!!!#3!!!EN!!!)6!!!
+!#3!5!!!!#3!!!EN!!!&k!!!![3!!!K-!!!"e!!!"X!!!!*N!!!'9!!!$!!!!!J-
+#!!"q!!!!,3!!!(i!!!"4!!!+!!!!!J-"!*!*!E8!!!)m!!!!!`!&!!!$0!"L!-J
+!BJ$!#3!!!!)$!3#3"$`!"3#d!!!!*!!!!-B!!!!Y!!!!#3#d!!!!*!!!!,3!!!!
+Y!!!!aJ!!!#d!!!#p!!!!,3!!!,d!!!!N!!!+!!!!!J-"!!!E!!!!,3!!!3i!!!&
+a!!!!!J!#!!!!A!"L!&J!BJ$N"!!!!!)$!J!!'`!!!#d!!!"M!!!!K`!!"3!!!!)
+$!J-!Q3!!!+X!!!%1!!!"F3#3"J)$!J!)!!!!!J-"!!!!!JS!q!#3#!'e!!!#2!!
+!!!J!SJ!!!"X!!!2kq2hkr[Vpq[lmp!$R!2)"k`,j![S(rJJ#$`34"Ji$$`%3!"$
+j$r8)q3Rk#Im*!!N!"3!&q`(l!2N,!a)'&3B1"!S%$J-(!!J!"r`)rJRr#`!,!")
+#%J)-!!m!$2`(qJ2k#r8+pJVi#I`)!!8!"3!)#J-(!JF$"J-("!8&"JB&#JJ+"JB
+&"J8&"3-'"!8&!`B""J%#%[m8r"Eq'2m0r`N!"J%&!`Iq"rd'r3Ep#r`-rJcr$2m
+1!!Rr"`!&rJEl#288pa$f&[d(r!F!qr[qq3$f!2-$m3A["rF(q3Al"2S%qJ$h!28
+!m`$X!26rp[Rkqr[mqrhkrrIrmI[Zp2Abmqclq2[kq[ck!2J!q`6k"IN&qJ2k!rN
+'qJEl"IJ(qJIl"ri'r3Elq[X!rIRrqJ$k!2F!qJ$jq2lir[6klrAcpI6eqIRkq[c
+l!rB*l`Vb#I-*q!Rm$3!4!#!*)3`P#LX1*!8S!K`!&2S2p!c[$1`-l!l[#23+p3A
+h!rJ"p[Eam2$XpqAiirhS!1d)m!hc$282m"Mh%rS4qad!&J-8%"N1$!N'"`3'!Jh
+l'[)CpK,m#[i(r`3*q`cf$r%4m!lZ$1N*j`AQ!q8!jrlSqZMfm[Raq2(dq2Elm2V
+K!,`3`JEP#1-&l`(j!38"#!B&"J!%"Ilr!*!%!J-#!!X!!!!#!`%!!')!f!!M!(B
+"'`'c!"X!!!!r!!!"%`!!!A`!!)"MAqJ!+J!M!(!"'`(!!*#c3!#3r`#3r`#3r`#
+3r`#3F`(rN"6!!*!8!Iq3&-!!N"3"rj!8`!#3&!(rN"6!!*!8!Iq3&-!!N"3"rj!
+8`!#3&!(rN"6!!*!8!Iq3&-!!N"3"rj!8`!#3&!(rN"6!!*!8!Iq3&-!!N"3"rj!
+8`!#3&!(rN"6!!*!8!Iq3&-!!N"3"rj!8`!#3&!(rN"6!!*!8!Iq3&-!!N"3"rj!
+8`!#3&!(rN"6!!*!8!Iq3&-!!N"3"rj!8`!#3&!(rN"6!!*!8!Iq3&-!!N"3"rj!
+8`!#3&!(rN"6!!*!8!Iq3&-!!N"'!!!!"rj!8`!#3%B!!!!(rN"6!!*!4J!!!!Iq
+3&-!!N"'!!!!"rj!8`!#3%B!!!!(rN"6!!*!4J!!!!Iq3&-!!N"'!!!!"rj!8`!#
+3%B!!!!(rN"6!!*!4J!!!!Iq3&-!!N"'!!!!"rj!8`!#3%B!!!!(rN"6!!*!4J!!
+!!Iq3&-!!N"'!!!!"rj!8`!#3%B!!!!(rN"6!!*!4J!!!!Iq3&-!!N"'!!!!"rj!
+8`!#3%B!!!!(rN"6!!*!4J!!!!Iq3&-!!N"'!!!!"rj!8`!#3%B!!!!(rN"6!!*!
+4J!!!!Iq3&-!!N"'!!!!"rj!8`!#3%B!!!!(rN"6!!*!4J!!!!Iq3&-!!N"'!!!!
+"rj!8`!#3%B!!!!(rN"6!!*!4J!!!!Iq3&-!!N"'!!!!"rj!8`!#3%B!!!!(rN"6
+!!*!3!3!!!!(rN"6!!*!3!3!!!!(rN"6!!*!3!3!!!!(rN"6!!*!3!3!!!!(rN"6
+!!*!3!3!!!!(rN"6!!*!3!3!!!!(rN"6!!*!3!3!!!!(rN"6!!*!3!3!!!!(rN"6
+!!*!3!3!!!!(rN"6!!*!3!3!!!!(rN"6!!*!3!3!!!!(rN"6!!*!3!3!!!!(rN"6
+!!*!3!3!!!!(rN"6!!*!3!J!!!!(rN"6!!*!3!J!!!!(rN"6!!*!3!J!!!!(rN"6
+!!*!3!J!!!!(rN"6!!*!3!J!!!!(rN"6!!*!3!J!!!!(rN"6!!*!3!J!!!!(rN"6
+!!*!3!J2rm!(rN"6!!*!3![`!$m(rN"6!!*!3$`!!!$hrN"6!!*!31J!!!!IrN"6
+!!*!2!F3!!!!"rj!8`!#3$`B%!!!!!Iq3&-!!N!mB"!!!!!(rN"6!!*!2B!3!!!!
+"rj!8`!#3$J'!"!!!!!(rN"6!!*!1!`!%!!!!!Iq3&-!!N!i-!!3!!!!"rj!8`!#
+3$KJ!"!!!!!(rN"6!!*!1)!!%!!!!!Iq3&-!!N!j!!!J!!!!"rj!8`!#3$3'!!!J
+!!!!"rj!8`!#3$3-!!!J!!!!"rj!8`!#3$3B!!!J!!!!"rj!8`!#3$3`!!!J!!!!
+"rj!8`!#3$3J!!!J!!!!"rj!8`!#3$4!!!!J!!!!"rj!8`!#3$5!!!!J!!!!"rj!
+8`!#3$8!!!!J!!!!"rj!8`!#3$F!!!!J!!!!"rj!8`!#3$B!!!!J!!!!"rj!8`!#
+3$!%!!!!)!!!!!Iq3&-!!N!`#!!!!#!!!!!(rN"6!!*!-!J!!!!J!!!!"rj!8`!#
+3$!3!!!!)!!!!!Iq3&-!!N!`%!!!!%!!!!!(rN"6!!*!-#!!!!"!!!!!"rj!8`!#
+3$"J!!!!3!!!!!Iq3&-!!N!`3!!!!%!!!!!(rN"6!!*!-%!!!!"!!!!!"rj!8`!#
+3$#!!!!!3!!!!!Iq3&-!!N!`J!!!!%!!!!!(rN"6!!*!-3!!!!"!!!!!"rj!8`!#
+3$%!!!!!3!!!!!Iq3&-!!N!a!!!!!%!!!!!(rN"6!!*!-J!!!!"!!!!!"rj!8`!#
+3$)!!!!!3!!!!!rq3&-!!N!b!!!!!%!!!!!2rN"6!!*!,!B!!!!!3!!!!!rq3&-!
+!N!X"!*!%%!!!!!2rN"6!!*!,!3#3""!!!!!$rj!8`!#3#`%!N!33!!!!"!#3"#!
+!!!!"!*!A!3#3""!!!!!%!*!%)!!!!!%!N"F"!*!%%!!!!!3!N!3J!!!!!3#3&`)
+!N!33!!!!"!#3""!!!!!"!*!A!J#3""!!!!!%!*!%%!!!!!%!N"F#!*!%%!!!!!J
+!N!33!!!!!3#3&`)!N!33!!!!#!#3""!!!!!"!*!A!J#3""!!!!!)!*!%%!!!!!%
+!N"F#!*!%%!!!!!J!N!33!!!!!3#3&`)!N!33!!!!#!#3""!!!!!"!*!A!J#3""!
+!!!!3!*!%%!!!!!)!N"F#!*!%%!!!!"!!N!33!!!!!J#3&`)!N!3)!!!!%!#3""!
+!!!!#!*!A!J#3"!3!!!!3!*!%%!!!!!3!N"F#!*!%!J!!!"!!N!33!!!!"!#3&`)
+!N!3"!!!!)!#3""!!!!!%!*!A!J#3"!%!!!!J!*!%%!!!!!J!N"F"!*!&J!!!)!#
+3"#!!!!!)!*!A!3#3"8!!!#!!N!3J!!!!#!#3&`%!N!9!!!!J!*!%)!!!!"!!N"F
+"!*!&)!!!3!#3"#!!!!!3!*!A!3#3"4!!!%!!N!3J!!!!)!#3&`'!!*!%#!!!3!#
+3"'!!!!!J!*!BJ!#3"!3!!%!!N!4!!!!!3!#3')!!N!3#!!"!!*!%3!!!!%!!N"L
+!!*!%!3!!J!#3"%!!!!#!!*!B3!#3"B!!J!#3")!!!!#!!*!B3!#3"8!!J!#3")!
+!!!%!N"P!!*!&)!#!!*!%J!!!!3#3'5!!N!83!)!!!!!"!!!!!J#3'5!!N!8)!)!
+!!!!"!!!!"!#3'4!!N!8%!)!!!!!#!!!!"!#3'4!!N!8#!)!!!!!#!!!!#!#3'4J
+!N!8"!)!!!!!'!!!!#!#3'3J!N!D!3!!!!!3!!!!3!*!C"!#3"N"!!!!!#!!!!#!
+!N"N%!*!'-#!!!!!)!!!!)!#3'3)!N!B))!!!!"!!!!"!!*!C!J#3"J33!!!!%!!
+!!)!!N"N"!*!'!JJ!!!!J!!!"!*!EJ!#3"3'%!!!!3!!!!J#3'm!!N!C$!!!!`!!
+!"!#3'd!!N!BJi!!!J!!!'!#3'b!!N!B3(rq3"H!!N"X3!*!'$!!!!J#3(`J!N!B
+#!!!%!*!I$!#3"J%!!!`!N"m'!*!(J!!B!*!I!`#3"f!!-!#3(`'!!*!)B!#3)%!
+!N!L!!*!J)!#3"`%!N#%B!*!("J#3)3`!N!F-!*!K!`#3"c!!N#%"J!#3"Q!!N#*
+J!*!&!B!!N#)B!*!&"J#3)`B!N!8B!*!M!F!!N!6J!*!N1!!!!!F!N#82!!!!2!#
+3*[`!$m!!N#B$rr!!N2m!N2m!N2m!N2m!N2m!N,B+!!!!!J-"!3#d!!!!,3!!!8`
+!!!%d!!!!!3!"!!!8J!"L!"J!BJ!B#`!!!!)$!3!!BJ!N!*!&Q!%(!,3!!!!Y!!!
+"6!!!!63!!)"MYX3!)J#3"CJ"%!#3)Im!N#(r!*$+!Im!N2m!N2m!N!3Irj!2m!#
+3%ArrN!rm!*!4rj!3rJ#3%!(rN"%!N"!$rj!4J!#3$`2rN"'!!*!2"rq3%F!!N!m
+(rj!4`!#3$`IrN"(!!*!2"rq3%F!!N!m(rj!4`!#3$`IrN"(!!*!2"rq3%F!!N!m
+(rj!4`!#3$`IrN"(!!*!2"rq3%F!!N!m(rj!4`!#3$`IrN"(!!*!2"rq3%F!!N!m
+(rj!4`!#3$`IrN"(!!*!2"rq3%F!!N!m(rj!4`!#3$`IrN"(!!*!2"rq3%F!!N!m
+(rj!4`!#3$`IrN"(!!*!2"rq3%F!!N!m(rj!4`!#3$`IrN"(!!*!2"rq3%F!!N!m
+(rj!4`!#3$`IrN"(!!*!2"rq3%F!!N!m(rj!4`!#3$`IrN"(!!*!+!Im!!!!(rj!
+4`!#3$`IrN"(!!*!2"rq3%F!!N!m(rj!4`!#3#rm!!!!(rj!4`!#3$`IrN"(!!*!
+2"rq3%F!!N!m(rj!4`!#3$`IrN"(!!*!2"rq3%F!!N!m(rj!4`!#3#J%!N!3(rj!
+4`!#3#J(r!!!!"rq3%F!!N!m(rj!4`!#3$`IrN"(!!*!2"rq3%F!!N!m(rj!4`!#
+3$`IrN"(!!*!+!Im!!!!(rj!4`!#3$`IrN"(!!*!2"rq3%F!!N![r!!!!"rq3%F!
+!N!m(rj!4`!#3#J(r!!!!"rq3%F!!N!m(rj!4`!#3$`IrN"(!!*!2"rq3%F!!N!S
+"r`!!!!IrN"(!!*!2"rq3%F!!N!S"r`!!!!IrN"(!!*!+!Im!!!!(rj!4`!#3$`I
+rN"(!!*!2"rq3%F!!N!m(rj!4`!#3#J(r!!!!"rq3%F!!N!m(rj!4`!#3$`IrN"(
+!!*!2"rq3%F!!N!m(rj!4`!#3#J%!N!3(rj!4`!#3#J%!N!3(rj!4`!#3$`IrN"(
+!!*!2"rq3%F!!N!m(rj!4`!#3$`IrN"(!!*!2!rq3%B!!N![r!!!!!rq3%B!!N!S
+"r`!!!!(rN"%!N"(rN"$q!*!4Irq3$r`!N"%Irj!2m!#3r`#32J(r!*$r!*$r!*$
+r!*$r!*"U!J-#!*!&!J-#!,%'!!!!:
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/MacDraw_II.hqx b/writerperfect/qa/unit/data/draw/libmwaw/pass/MacDraw_II.hqx
new file mode 100644
index 000000000..01185c149
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/MacDraw_II.hqx
@@ -0,0 +1,110 @@
+(This file must be converted with BinHex 4.0)
+:#R0TEA"XC5jYC()!4&*A4de%8%`"!!!!%!!!!!fC'k4%8PG(4$)!!3!2!!!"D!&
+S!*!%$VJ,32qerkB2,3ZDB`)&+!2m!3!!!!&S!@J!N!31Z!Y!!!%&!!"N!!%!!!!
+"!!)!!!!"*`m!!3#3$K!!N!N3!2qerkB2,3ZD!!J!N!iC!3!#!(J!5!!!!%J!N!J
+"!3#3E`-!"J!'!!%!"J!'!$8!1`!)!*!*!`!$!!!!!3!!!!B!N!PdJ!!!2S!!!3H
+!!!'MJ!!!G)!!!$k!!!%(J!!"Si!!N!3'!!!!!`!!J!!!!)!!!BQ!!!)PJ!!!G)!
+!!$k!!!%(J!!"Si!!N!3'!!!!!`!!J!!!!)!!!BQ!!!)PJ!!!G)!!!$k!!!%(J!!
+"Si!!N!53!!!!!%J!!!#S!!!!9!!!!")!N"B"J!!!!"F!!!%N!*!+!C!!!!!"3!#
+3%`9!)J#3"MqmFFFFFFFF!!JJ!*!%!8!'V9UeDY@V2pD6k6k6k6m!#L%$!!!!!6r
+i!*!'2q99N!B!$#!"!!!!!6rL*%L4)N5*2r`iiiiiiii!!5%$!!!!!8!Fc*!&c6r
+"aaaaaaab!"3J!*!%!6r1Z&(VK4ki3"#UN!@V!5`J!*!%"!!"!!!!!3!"!!!!!3!
+#!!!!!J!#!!!!!3!%!!!!"!!%!!!!!3!'!!!!"J!'!!!!!3!)!!!!#!!)!!!!!3!
++!!!!#J!+!!!!!3!*!!!!#3#3&3%!'`!!!!N!N"8"!")!!!!5!*!9!3!f!!!!%J#
+3&3%!5!!!!!N!!!!*!!!!#3#3$3%!5!!!!!N!!!!*!!!!#3!!!!N!!!!*!*!&!3!
+"!!`!!!!%!*!&!3!#!!`!!!!$!*!&!3!$!!B!!!!'!*!&!3!%!!`!!!!&!*!&!3!
+&!!8!!!!&!*!&!3!'!!-!!!!$!!!!!`!3!!`!!`!!!!`!N!N#!*!(!J#3#`,rN!3
+!N!d*!!!!C`!!!"N!!!#X!*!%J!!!!)!!!BQ!!!)PJ!#3$JN!!!"R!!!!'3!!!+`
+!N!5!!!!!J!!"LB!!!L@!!!"I1Z!!!!"!!!!!$)!!!!3!!!!(!!!!!3#3#`(rN!3
+!N!edJ!!!2S!!!3H!!!'MJ!!!2`!!!(`!!!"2!!!!U!#3$h5!!!!qJ!!""i!!!D1
+!!!!r!!!!I!!!!%m!!!#S!!!!AcPd!!!!)!!!!!J!!!!&!!!!$`!!!!-!N!X$rj!
+%!!!!!`!!!!%!!!!$!(5!!!!qJ!!""i!!!D1!!!"dJ!!!2S!!!3H!!!'MJ!#3"!-
+!!!!"!!!!!`"dJ!!!2S!!!3H!!!'MJ!!!G)!!!$k!!!%(J!!"Si!!!&mk'!!!!'!
+!!!!3"QeKFh4PFJGcE'PNC5!a"h0XD@4P)$)!!!%)!!!!&!!!!!`!!!!%!!!!&!#
+3pa`!!!!"!!!!#!!!!!%!!!!)!!!!!3!!!!J!!!%)!!!!&!!!!!3!!!!`!!!!A!#
+3piJ!!!!"!!!!,!!!!!J!N!8+!!%!!3!!!!S!N!8,rrm!%!!-!"!!$!#3"3%!!!!
+X!!!!$!#3"3F!!3!"!!!!"`#3"3Mrr`!3!!`!%!!-!*!&!3!!!#`!!!!3!*!&"`!
+"!!%!!!!(!*!&#2rr!"!!$!!3!!`!N!3"#!!!!"3!!!!%!!!!'!!!!#J!N2Fi!!!
+!!3!!!"4dD'8JE@&cG'9b!"3!!!!"!!!!%(0XD@4P)$%-!!!!!3!!!""cE'PNC5!
+b!!!!J!!!!)!!!BQ!!!)PJ!!!!`%"!!B!$`#3#3N!!!"R!!!!'3!!!+`!!%!"!3#
+3#!J!N!8r!!!!I!!!!%m!!!#S!!"!!3#3#3`!N!@&J!!!2S!!!3H!!!%QJ!!)!`%
+"!!B!$`#3#A5!!!#GJ!!!qB!!!D1!!!J&!3%!"J!+!*!*R!!!!0i!!!#X!!!"#J!
+!5!%!N!8&!!!!%!#3"!+3$33#N"X!!!!"!!J%!T!6"!+3#`3#N"-%!T!,!!!!!3!
++"!)#!J3#N!8%!J)#"!)%!J)#"!+3"33#!J)%!J3#!J)%!T!&"!)#!J3#"!)#!J3
+#N!8%!J)#"!)!!!!"!$`#"!)%!J3#"!3#"!)%!J3#!J3#"!)%!J3%!J3#"!)%!J)
+%!J3#"!)%"!)%!J3#"!)#"!)%!J3#"!3#"!)%!J3#!!!!!3!-!J3%"!)%N!8#"!3
+%!J3#"!3%!J53"3)%"!3#"!)%"!3#"*!&!J3%"!)%!J3%"!)%N!8#"!3%!J3!!!!
+"!!d#"!3%!J53$3)%"!3#"*!*!J3%"!)%N!d#"!3%!J53#3!!!!%!$J)%N"-#"*!
+,!J53%`)%N!X!!!!"!!m#"*!M!J53'`!!!!%!"`8#N#-&!T!E!!!!!3!)"3+3%`8
+#N!X&!T!6"3+3#`!!!!%!#J8#!J)&!T!&"3)#!J8#"3)#!J8#N!8&!J)#"3)&!J)
+#"3+3"38#!J)&!J8#!J)&!T!&"3)#!J8#!!!!!3!m!J8#"3)&!J8&!J8#"3)&!J)
+&!J8#"3)&"3)&!J8#"3)#"3)&!J8#"38#"3)&!J8#!J8#"3)&!J8&!J8#"3)&!J!
+!!!%!$!)&"38#"C!&!J8&"3)&!J8&"3)&N!8#"38&!J8#"38&!J@3"3)&"38#"3)
+&"38#"C!&!J8&"3)&!!!!!3!0!J8&"3)&N!d#"38&!J@3#3)&"38#"C!0!J8&"3)
+&N!N!!!!"!!i#"C!6!J@3#`)&N"-#"C!,!!!!!3!2!J@3)`)&N"X!!!!"!!F'!T!
+M"J+3'`!!!!%!#!B#N"-'!T!,"J+3%`B#N!X!!!!"!!S'!J)#"J+3"3B#!J)'!JB
+#!J)'!T!&"J)#!JB#"J)#!JB#N!8'!J)#"J)'!J)#"J+3"3B#!J)'!J!!!!%!2!)
+'!JB#"J)'"J)'!JB#"J)#"J)'!JB#"JB#"J)'!JB#!JB#"J)'!JB'!JB#"J)'!J)
+'!JB#"J)'"J)'!JB#"J)!!!!"!!`#"JB'!JD3"3)'"JB#"J)'"JB#"T!&!JB'"J)
+'!JB'"J)'N!8#"JB'!JB#"JB'!JD3"3)'"JB#"J!!!!%!$3)'"JB#"T!0!JB'"J)
+'N!N#"JB'!JD3$3)'aA3!!!%!!!!,d`!!#Y-!!!('!!!!!JadCA0dGf3e5@jNCAJ
+#!J!#!%*AF(4#9fYc!3!6FfPYF'aP,QeNFM)b0MNh0$)h1!)!!!"%8PG(68436!!
+!4&*A4de%8%`!N"M31PT&!!!3!!!!$CN!N!S1!*!%!JKdCA0dGfYc-J!#!!)!39G
+A8&"656)"!!!!!3#3"L8!N!3$S`!!#!#3#meEl!V0@qc3!*!@!bB!!3#3'!i!N!4
+B4!d!#3!U!!-"f`*J!!!!!3!"!!%!!3!#!!)!!3!"!!%!"J!+!!-!$!#3"`)!N!B
+#3!!!!['CQJ!!!,i!!!$a!*!+!['CQJ*!!*!&5!#35a,rN")!!!#3!!!"!!!!!3!
+!)3#3$!J!!3!"!!!!!3!!)!!$!*!+#J!#!!"!!!!"!!!K!J%!N!S-!!-!!3!!!$)
+!!#!!!`#3#J%!"!!#!!!!!3!!)3#3$"3!"3!"!!!!!3!!)3#3#`%X!!B!!!#3!!!
+"!!!!!3!!)!#3$!J!!3!"!!!!!3!!)3!$!*!+#J!#!!"!!!!"!!!J!J%!N!S-!!-
+!!3!!!$)!!#%!!`#3#J%!"!!#!!!!!3!!)!#3$"3!"3!"!!!!!3!!)!#3#`%X!!B
+!!!#3!!!!!!9!)J#3"MqmFFFFFFFF!!JK!*!%!8!'V9UeDY@V2pD6k6k6k6m!#L!
+$!!!!!6ri!*!'2q99N!B!$#%"!!!!!6rL*%L4)N5*2r`iiiiiiii!!5!$!!!!!8!
+Fc*!&c6r"aaaaaaab!"3K!*!%!6r1Z&(VK4ki3"#UN!@V!5`K!*!%-!!"!!!#!!!
+"!!)!!!)!!!)!"!!!!J!!!`!'!!!#!!!%!!J!!!)!!!8!#J!!!J!!"J!!!*`!#3!
+!!!N!N"-"!"X!!!!*!*!6!J!5!!!!%J#3%`-!0J!!!")!N"-%!%J!!!!*!!!!#3!
+!!!N!N!X&!%J!!!!*!!!!#3!!!!N!!!!*!!!!#3!!!!B!!!!m!!`!!!!%!!!!!3!
+-!!!!!`!!!!)!"J!!!!B!!!!$!!`!!!!&!!!!"!!&!!!!"3!!!!8!!`!!!!-!!!!
+'!!!!'J!!-!!#"!!E!!!!(J#3"-!!N!`)!!!!!3!!!!-!!!!1!!%!!!%!!!)!N!Q
+5rj!)$deKD@iJ4'PMG'P[EQ&bH3#3-!p9Ff9b)%4TBh4TEfjKFRN!N$$m'I`C!!%
+!N!F)!!!!!`#3"`F'4f9ZCACK!!!!e!#3"38!!!!'!!!!#J!!!!X!!!!-!!!!$3!
+!!!i!!!!2!!!!%!!!!"%!!!!5!!!!%`!!!"3!!!!9!!!!&J!!!"F!!!!B!!!!'3!
+!!"S!!!!E!!!!(!!!!"d!!!!H!!!!(`!!!#!!!!!K!!!!)J!!!#-!!!!N!!!!*3!
+!!#B!!!!R!!!!+!!!!#N!!!!U!!!!+`!!!#`!!!!Y!!!!,J!!!#m!!!!`!!!!-3!
+!!$)!!!!c!!!!0!!!!$8!!!!f!!!!0`!!!$J!!!!j!!!!1J!!!$X!N!3#a!!!!!&
+i2"i2Km2Km!!!!!')4#)4L%3L%3!!!!'llYehZqlGG`!!!!(--fDCc$0QQ3!!!!3
+!N!X'rj!)!!!!!Arrrrrhrrrr!!!!!ArrprprrrIr!!!!!AIrhIphrphr!!!!"(I
+GGpehhAIG!!!!!kT9UP@U9DT9!!!!!iJLL#+))SJL!!!!!iJ!)J#)!#)!N!3$J!!
+)!)!!#!#3"!@!!!!!#!#3"J'!J%%q#!J8i`!!!!(rJ)#!r`J)#!!!!!'"3L3BJ8)
+N'!!!!!'!3#!3#!3#!3!!!!(JF$JF$JH$`3!!!!&hZphZGl[GlJ!!!!')4#)4L%3
+L%3!!!!'Cc'BcQFaQ-`!!!!%J3)!!#!3#!*!%!Im!r`$r!2m!N!3"r`!!!2m!N!B
+"c!!!!$-!N!B"m*!%$j!%!!!!!Iq)L)MrL)L)!!!!!DT%UK'U4+S4!!!!!3%#"!J
+3)%#!!!!!!B-($K`iF1$"!!!!!HlGZhIZhEYh!!!!!4%L4)J4)N5)!!!!!60Qc*N
+cCXbC!!!!!8#J!!!%#J#3"3'UN!J!!!!"L*!)!!!!!3%"%"!"!4!3!!!!!3!)&#T
+9+K3)!!!!!Iq!N!F!!!!"JN3S%#K%JJ%!!!!"J!#3#J'!%!)J!3K!"!!!!!'U!+S
+!UJ#U!*!%!9Ar9Ip9reAr!!!!!GhrGrrGrhIr!!!!!DS!J!#)!)!!N!3"#"`L`B!
+"!J3!!!!"X6!$'pM!$)d!!!!"L"3L3BJ!UJ#3"!'#4$P%JJ%"!3!!!!%$K%J`$!)
+"!3!!!!&9S%"!93S%"!!!!!%3)&5Ur`)%#!!!!!%J8)L3"!8#!!!!!Em![lq`N!3
+!!!!"q(3L4imA)R%!!!!"GiQ2MhHBq2J!!!#!!!!!!3!&rj!'!!!!(J!!!!%!"J#
+3#5%!!!!"!!cGD`M#"U)!!!$0!!!!!3!+!!#!!"'`!!!"93!!!!%!#`#3"03!!!!
+"Q3!!!!%!$r`!mhd&,`!!!%8!!!!"!!d#3DY8k[m!!!%4!!!!!3!1mYF)9S6X!!!
+!L3#3"qB!"!#3!!$J!*!%rrr[R`C-BAP[GA339(9bEL""GA4[Ch*TC#"2EJ#3"!Y
+6D'ph)&*eE'9bF`#3"!j6D'ph)%GbD@4XD@jPF`#3"!P6D'ph)&0THQ8!N!338fK
+[Gb"3B@GP)%*bC@&VF`#3"!%Y!*!%"daKH@9bFmN!N!3(8R9XCA*cb3#3"!P3BA4
+dCA*ZFmN!N!3-8(*PCQ9bC@jMCA2*!*!%$84bBAGTEQFJ8fPkCFN!N!3",3#3"!e
+'DA3J9'mJ9fPZC'ph!%d!!!P6CA3J9QPPGmN!N!L4!!F!9`#`!*!%rrrmr`4'Efj
+d"d0SD@0KCfm!N!3(3fpeFQPPFJ#3"!C(C@jPGQ%!!")!#8KPE(CPG'PMB3#3"!C
+0EfjKBfm!N!3)6Q9h)&P[FQX!N!3&9'PYCA-!N!3'9Q9ZD@0P!*!%!5d!N!3'4Qp
+ZG(2*!*!%#90PG#"6G(PXC3#3#,%!#2q3"!#3"2rrhIm%8fPkC3Fj)&"[D@jd!!!
+!#!)a-!!!!!J#-6)!!"))!M%d!!!!#!)a1!!!!!J#-M3!!!!)!M-f!!!!#!)d1!!
+!!!J",3#3"!a6D@jRE'8J8h"KBf8!!")!$%4[G@*XC5"6F'&MC3#3"!Xb)("d,L"
+6F'&MC3#3"!%Y!*!%#dC[ER3J8fPkCA2*!*!%$8aTEQ8J8h"KBfPZCmN!N!F"!!!
+!#p-!!!V6!!!"aJ"I1G3Dd!!!!"`"aJ!64'PZCJ!!!+*%GRGc!!!!VN4cG'`!!!#
+k8R0d-J!!!-C5Ff9d!!!!dN45G@`!!!$H8(0PG!!!!1T%Ff9d!!!!pN&cCA3!!!%
+#8(*PCJ!!!3ji8(*Q!!!"'R"3FQB!!!%QFe"bCJ!!!6*'EA4i!!!"2NCZEA-!!!&
++F'&d8J!!!9CLBAG3!!!"BN0dBQ`!!!&ZBfpX8!!!!AT048j9!!)"KJ%!rrm!N!9
+I1Y`"!2rr!!!!A!"I1MJ"!2rr!!!!U!"I1J3"!2rr!!!![J#3"!%!rrm!!!&5!&m
+k!!%!rrm!!!(Q!&mk4!%!rrm!!!*k!&mlP!%!rrm!!!+Z!&ml,!%!rrm!!!01!&m
+m2!%!rrm!!!11!&ml%!%!rrm!!!1X!&mli!%!rrm!!!1i!&ml1!%!rrm!!!2+!&m
+jR!%!rrm!!!4J!&mlY!%!rrm!!!4X!&mlL!%!rrm!!!4h!&mlN!!"!2rr!!!&6`"
+I1j`"!2rr!!!)&`"I1jJ"!2rr!!!)Q`"I1qJ"!rrr!!!)R`"I1c`""[rr!!!*L3"
+I2#3""rrr!!!+(J"I2!`!*3:
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/MacDraw_Pro_1.0.hqx b/writerperfect/qa/unit/data/draw/libmwaw/pass/MacDraw_Pro_1.0.hqx
new file mode 100644
index 000000000..f89c71180
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/MacDraw_Pro_1.0.hqx
@@ -0,0 +1,109 @@
+(This file must be converted with BinHex 4.0)
+:#R4PFh404&!a,M!!C%4[Bf43FQm"!!!!%!!!!!cJjC0N4'pM4$,rr`!2!!!"D!&
+S!*!%$VJ,32qerkB2,3ZDB`)&+!2m!3!!!!&S!@J!N!31Z!Y!!!%&!!"N!!%!!!!
+"!!)!!!!"*`m!!3#3$K!!N!N3!2qerkB2,3ZD!!J!N!iC!3!#!(J!5!!!!%J!N!J
+"!3!#!*"Y!3!'!!B!!3!"!!B!"J!"!!%!!!!,!!!!!J#3#!%PT8X!MMaj!8ZP5`#
+rQAN"*D9,!)imH3&,T8X![jPj!!!!#`#3"5'&#J!R,em"5k9,!F"I[`%PT8X!MMa
+j!8ZP5`#rQAN!!!!,!*!&)B8+!#F[A`&,T8X"`&qr!5@P5`#12(N"5k9,!,qCH3!
+!!*!!!!!!5!!!!+J!!!"8!!!!&J!!!1i!!!##!!!!#J!!!43!N!S$P!!!!B3!N!9
+4rkJ!!!!"!!!!!8!L!*!'2laaaaaaaa`!##%!N!3(3!DY@V9UeDXreT2T2T2T2`!
++)!-!!!!"2rJ!N!Brj9@3"J!-)3%!!!!"2q)N5*%L4)Nrr$MMMMMMMJ!")!-!!!!
+"3"c-N!A02m(((((((()!&#%!N!3"2mki8HZ&(VK!%+U3"DX",#%!N!3(!!%!!!!
+"!!%!!!!"!!)!!!!#!!)!!!!"!!3!!!!%!!3!!!!"!!B!!!!'!!B!!!!"!!J!!!!
+)!!J!!!!"!!S!!!!+!!S!!!!"!!N!!!!*!*!9!3!E!!!!#3#3&3%!%J!!!")!N"8
+"!$B!!!!5!*!9!3")!!!!#3!!!!N!!!!*!*!0!3")!!!!#3!!!!N!!!!*!!!!#3!
+!!!N!N!8"!!%!$!!!!!3!N!8%!!)!$!!!!!-!N!8"!!-!"J!!!!B!N!8"!!3!$!!
+!!!8!N!8"!!8!"3!!!!8!N!8"!!B!!`!!!!-!!!!&!!d!!!!*!!!!&3!!!$!!!-!
+'!!!!"3#3(2rr!*$4!3#3"`X!N!X,rj!%!*!-!5@P5`#12(N"5k9,!,qCH3!KK3S
+!*bpI!8ZP5`(!Alm!N!`"*D9,!)imH3&,T8X![jPj!#'&#J!R,em"5k9,!F"I[`"
+4rm3!!!&f!!!!#!!!#8CPG@PXE'8J-3!!!3J!!!!-!!!!"!#3r``!!!!"!!!!#!!
+!!3J!!!!S!!!!"!!!!'!!!!#B!!!!p!!!!5`!!!')!!!"`!!!!K`!N1)#M!!!!!%
+!!!"F!!!!#!!!!"`!!!!"!!!!!J!"!*!%J!#3"Khrr`!!!!%!$3!!!!N!N!HD#`#
+3"!%!!!!F!!%!$3!!!!N!N!d1!*!&!3!!!$J!!J!"!!'K+`#3#@"J`J!&UeF!$NK
+8!!KF-3!1%e8!"0GF!!hH9J!"8SF!!!!"!!!!A!!!!!`!!!!0!!!!!3!!!!)!!3#
+3")!!N!B1rrm!!!!"!!d!!!!*!*!(5,L!!!!!!3!!!!d!!3!0!!!!#3#3$3i!N!8
+"!!!!1!!#!!%!!D%V!*!*B'$#!!@V9`!15&3!#&`a!!i693!%ee`!$Gj@!!&5K`!
+!!!%!!!"F!!!!%!!!!"%!!!!"!!!!!J!"!*!%J!#3"K,rr`!!!!%!$3!!!!N!N!G
+CBS!!!!!"!!!!%3!"!!d!!!!*!*!0$J#3"3%!!!!i!!)!!3!"S5X!N!PJB-)!"DY
+A!!j)9!!)A$%!$K09!!6AA!!0hPB!!9+(!!!!!3!!!&`!!!!8!!!!#!!!!!%!!!!
+#!!%!N!5!!*!'#Irr!!!!!3!0!!!!#3#3"bB#J!!!!!%!!!!)!!%!$3!!!!N!N!d
+1!*!&!3!!!(!!!!!B!!!!"J!!!!%!!!!#!!%!N"L!!*!'"rrr!!!!!3!0!!!!#3#
+3"b&G!*!%!3!!!!B!!3!0!!!!#3#3$3i!N!3"#!!!!"`!!!!%!!!!+!!!!%!!!!"
+F!!!!E!#3lh`!!!!"!!!!*%%JFfeKE'`J6@&M4(*KGb"3FQmJCQPXC5!a,M!!!!!
+"!!!!''%JBQaeC5"cFA9KFQ8!!#J!!!!"!!!!('%JCh*PC@iJFQ9MG#"[GQ&X!!!
+N!!!!!3!!!""K)'0TFQ0XC3!!!!%!!!!3B5"ZEh4P!$!!)B8+!(3iF3![K3S"$N0
+a3!%!N!X)!!"!!!"AAlm!*bpI!+6SdJ#6jXi!!`!"!J$!"X!'!*!'J!!!9)S8!,I
+!J3#@[(N"2IVf!!3!!3)!`!E!"J!"aBX!!)!"!&GI[`&U9DX!LfA-!F"I[`!&!!%
+#!-!'`!B!N!D!!J#TP#J!A3X@!3VdkJ"QCdG!)J!"!J$!"J#3"3`!N!3"%REZ!$A
+EY`%JGZi!IT3h3!%!N!X3!!"!!!#ECp!!pKdk!2c)NJ$rH@Y!)J!"!J$!"J#3"43
+!N!AqRci!e*Nb!3bI2J%Yql*!!3#3#aJ!!%!!!*,QcJ'5"3N!p%H3!!'EB6T!)J!
+"!J$!"J#3"4`!N!Af(M`"H3)%!33H2!'I")4!!3#3#b!!!%!!!5@P5`#12(N"5k9
+,!,qCH8!+!*!,*!!!3!$rrc-c!!!!,!#3"30e9Irr-c-!!!!Y!*!&!i!!rrmc-`!
+!!#i!N!8$K9Arrc-c!!!!,`#3"31+U[rr-c-!!!!`!*!&!irrrrmc-`!!!$%!N!8
+$P96rrc-c!!!!-J#3"31GU2rr-c-!!!!c!*!&!kUTrrmc-`!!!$3!N!8$[rrrrc-
+c!!!!03#3"32992rr-c-!!!!f!*!&!q10rrmc-`!!!$F!N!8$lMMrrc-c!!!!1!#
+3"3-!!2rp6-d!!!!j!*!&!`UVrre-c3!!!$S!N!8$&9Arr8c0!!!!1`#3"3-J!2r
+p6-d!!!!m!*!&!b99rre-c3!!!$d!N!8$+UVrr8c0!!!!2J#3"30!!2rp6-d!!!!
+r!*!&!e99rre-c3!!!%!!N!8$DUVrr8c0!!!!33#3"30e9Irp6-d!!!"#!*!&!i!
+!rre-c3!!!%-!N!8$K9Arr8c0!!!!4!#3"31+U[rp6-d!!!"&!*!&!j!!!2rp6-d
+!!!"'!*!&!j99rre-c3!!!%F!N!8$RDMrr8c0!!!!5!#3"31UU[rp6-d!!!"*!*!
+&!lrqrre-c3!!!%S!N!8$e9Arr8c0!!!!5`#3"32MMIrp6-d!!!"-!*!&!qiirre
+-c3!!!%d!N!8$!!$rrQCQ!!!!6J#3"3-+UrrqCQB!!!"2!*!&!a99rrjQCJ!!!&!
+!N!8$)!$rrQCQ!!!!83#3"3-P9IrqCQB!!!"5!*!&!bUUrrjQCJ!!!&-!N!8$3!$
+rrQCQ!!!!9!#3"30992rqCQB!!!"9!*!&!fUUrrjQCJ!!!&B!N!8$G9ArrQCQ!!!
+!9`#3"31!!2rqCQB!!!"B!*!&!i99rrjQCJ!!!&N!N!8$LUVrrQCQ!!!!@J#3"31
+3!!$rrQCQ!!!!@`#3"3199IrqCQB!!!"F!*!&!jfSrrjQCJ!!!&d!N!8$UUVrrQC
+Q!!!e@3!!!3!!!!S+!!!*#J!!!YB!!!!#$R4PFh4(FQ&`D#jhF(-cG`)!!J""9eG
+3690A5`TdCA0d6843-5i`!!)!!!"N4'pMC&"bE`#3#Q4%Ef0N8(*[!*!Bd(I'3!!
+!%!!!!!cJ!*!-%3#3"!),G'9cG%GbBA"S3eF#!!)!3eGA8%*23Nm"!!'!!8!!N!3
+#[3#3"!r&!!!3!*!&!FJ!!!J!cQa0IFjXlYi!N"B%'J!#!*!)""`!!3#3$A*N(3%
+*!#N!!`(G!M-!!!!#!!)!!!!"!!%!!J!#!!%!!3!"`!E!"J!"!!"!!!!"!3%!&3!
+`!*!%rrm!N"B#3!!!!['CQJ!!!6UP5`#@2(N!N!J#mCQD!N!!N!8'!!-!N!F5!!%
+23fpeE'9eFR-J3faKFQPc!!!!,J!"!+J!8Ip3!!J!&3!!!'3!N!9N!!!!8Im-!&(
+r@!"4re`!N!dm!!!!!3#3"31GU2rqCQB!!!"F!!!!!3#3"30992rqCQB!!!"8!!!
+!!3#3"3-!!2rqJ!#3"')!!!"3!*!13fp&6!!3!*!08Ip`!*!-4&"$E`!8!!-!N!4
+$EdjK!!X!$J"4rhJ!N!X3!!%06@pdD@Cc)%0XBA*TF`!!!#i!!3"!!&(r,!!)!!J
+!!!"N!*!&C!#3"e(r0!"4rcJ!N!d+!*!08!!"!*!,!9"K48`!$J#3"`%!!!!"!&(
+r9!#3$%438'%!%J#3"3&3B8jK!!i!)!"4rd`!N!X5!!%24)jRFQ&NMR-J3faKFQP
+c!!!!,J!"!"!!8Im)!!)!#!!!!'3!N!9N!*!(8Im3!&(r&!#3$3S!N!e3!!)!N!X
+#8Q&&6!!d!*!(!J!!!!)!8ImS!*!-4&"5B3!i!*!&!P*K6Q%!$J!J!&(r-!#3#bi
+!!3!I!&(rG!!"!"m!!!"N!*!&#`#3"e(rI!"4ri!!N!d+!*!08!!$!*!,!dCK48`
+!@J#3"`-!!!!$!&(rN!!!N!a%8%CK!$B!N!8$4Q&1B3!3!#!!8IqN!*!,E!#3Ea,
+rN")!!!#3!!!"!!!!!3!!)3#3$!J!!3!"!!!!!3!!)!!$!*!+#J!#!!"!!!!"!!!
+K!J%!N!S-!!-!!3!!!$)!!#!!!`#3#J%!"!!#!!!!!3!!)3#3$"3!"3!"!!!!!3!
+!)3#3#`%X!!B!!!!`!!%!!!)!!!%!!J!!!J!!!J!%!!!#!!!$!!B!!!)!!!3!#!!
+!!J!!"3!+!!!#!!!'!!!!R)!*!!!!#3#3%`'!'`!!!!N!N"-#J")!!!!5!*!6!i!
+f!!!!%J#3%`5!5!!!!!N!!!!*!!!!#3#3#`@!5!!!!!N!!!!*!!!!#3!!!!N!!!!
+*!!!!"J!!!$`!$!!!!!3!!!!"!!`!!!!$!!!!!J!'!!!!"J!!!!-!$!!!!!8!!!!
+%!!8!!!!&!!!!"3!$!!!!!`!!!!B!!!!D!!8!!!`!!"aBX3!H!*!%`!#3$#i!!3#
+3"@3!-J$A!4J!-J!b!0J!b3"N!A3!UJ),!)`!P3#J!6)!N!F#!!!!"J%!!3!!!3!
+!!!)"!3!!!!3!!!!"!!!!"J#3"!%!N!55rj!)&N4TBh4TEfjZB@PbC5"`FQPZBfP
+`B@`!N#NB4'PMG'P[EQjKDA*P)(9dD@aTFf&dCA9b!*!Rr"Rm'3!"!*!(+!!"!!!
+!!3!!!!%!!!!"!!!!!3!!!!%!!!!"!!!!!3!!!!%!!!!"!*!&&!!!!!%!N"-)!!!
+!&3#3"`S*5'9XGQ9dD@0K!!!!#!(j!#S!6N3B!!!"q4K"FQPKE#"09#"$EfjNC@j
+cC@3J6'PRD(3,3ACKER3J4f&bC'883QpNEfjT)%e8)&9XG(*K)%*[E'3(3Qp[Dfe
+KEJG$D'PMB@G["d0[GA*TCA))4'9XF'KTB@i*4A0`H5"6B@jc$N9cF(NJ8f&ZFb"
+#EfaN$'9AEh*XC#"8D@GSG!p(BA*KE@pZC#"1BA*bEhF'4f9ZCACK'%GTE'`J8f&
+ZFb"$EfjNC@jcC@3J3QpXC!P)C@afCA4TBf%25'9XGQ9dD@0K)%*XB@0V&%KPE(C
+PG'PMB5"$Efe`FQ9cFf9N#%YXB@jR)%e8$8aeBQ&XD@iJ4h*KF'J06(9MD@4K)%*
+bD@GSG!G0B@0SD@jP"Ne[EQ&ME`K09#"&H(4bB4*1)%KPE(CPG'PMB5"1BA*bEhF
+)6Q&ND@&ZEQ826Q9h)%*PFQpXD@jK)%e8%NjPGb"$C@jdGA*j)&0MD'aLD`K1CAF
+J@@pbDa"2E'3J4@jRE'PcD#"8CAKd%dpXC#"&EQGXDA0S)&4PH(3J693%6fjjH!C
+2H'C[FQ3)8'&XBA4TEQm18f0bDA"d)%e8)%*[E'3&8hGTEQF'8hPYBQpX#&4PE'9
+dCAKd"94TE@9c"e48@8C[ER30@Q&`CL"$D'&ZBf9bH3eDBA"Q)%4TEQGLBA4c"&T
+PB@`&9P3a-$!!!!!)!"X!#!"14"!!!!!E"6NJF(4c!M%`!M%b!M%d!M%i!M)d!M-
+f!M3i!!!"!!!!#JS!!!N+!!!#eJ"*k-`BqJ!!!"`#eJ!G4'PZCJ!!!2*69&P*!!!
+!rP088L-!!J%+99"%6!!$!5j%8%0[!!!"AP"K4%)!!`&U4&"3B3!!!CT%8&*K!!!
+"TN434Q%!!!'b4(ChF`!!!Ej%Fh4X!!!"bP*cCA3!!!(@8(0PG!!!!H*%Ff9d!!!
+"lN&cCA3!!!(k8(*PCJ!!!JC3FQBa!!!#%P"bCM)!!!)H8(*Q-`!!!LT3FQBd!!!
+#0P"bCM8!!!*#8(*Q0J!!!Nj3FQBi!!!#@P"bCMN!!!*Q4QedH!!!!R*'EQec!!!
+#IQCZG%`!!!++CQjd4!!!!TCcDAT-!!!#SR0THN3!!!+Z!3$rr`#3"8j%E!!!rrm
+!!!"f!%j%D!!!rrm!!!#!!*!&!Irr!!!"A!#3"3,rr`!!!J3!N!Err`!!!*B!N!8
+"rrm!!!&`!*!&![rr!!!#'J#3"32rr`!!!Ui!N!Err`!!!-J!N!Err`!!!3J!N!8
+"rrm!!!'`!*!&![rr!!!#@J#3"32rr`!!!Zi!N!8"rrm!!!'L!*!&![rr!!!#6!#
+3"32rr`!!!Z!!N!3"!2rr!!!$3J"14&J"!2rr!!!$XJ"14&3"!2rr!!!$b!"14&!
+"!2rr!!!%A!"14%`"!2rr!!!%N!!!6N4)!3$rr`!!"6!!6N4%!3$rr`!!"A!!6N4
+!!3$rr`!!"Bi!6N3m!3$rr`!!"F!!6N3i!3$rr`!!"FS!6N3d!3$rr`!!"G!!6N3
+`!3$rr`!!"GJ!6N3X!3$rr`!!"H)!6N3S!3$rr`!!"RJ!6N3N!3$rr`!!"U3!6N3
+J!3$rr`!!"V`!8Ir!!3$rr`!!"XJ!8Iqm!J$rr`!!"YB!6N3F!J$rr`!!"Z)!6N3
+B!J$rr`!!#0m!6N38!J$rr`!!#1X!6N33imS!:
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/MacPaint_1.0.hqx b/writerperfect/qa/unit/data/draw/libmwaw/pass/MacPaint_1.0.hqx
new file mode 100644
index 000000000..a8d23fe54
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/MacPaint_1.0.hqx
@@ -0,0 +1,72 @@
+(This file must be converted with BinHex 4.0)
+:#R"KD@jd-5jYBh!!8%j84de36P3"!!!!$J#3"3+G!!!!![q3#0hrGrrGrhIrhAI
+GGpehhAHU9DT9UP@U99Ar9Ip9reArUT!)lYflGqlGZhH)N!La-!-Ef-!-MB!3!L!
+"#%!%riL)L2q)L)MrJ)#!r`J)#)!!N!H!3#!!!J3)!)*%185#!3%"q(3L4imA)R&
+9S%"!93S%"#"3L*!%"3+r!,qrX*!%!*!)J!!)!)!!#!#)!#)!L!!L!)JLL#+))SJ
+LUJ#U!+S!UJ$r!2m!r`$r!"%L4)J4)N5)r`!!!2m!!!!"!J3)%#"!J+S!J!#)!)!
+!ri#3"`JF)X'!!3)%L"3L3BJ!UJ"!S!!!"!S!!!1%5$!-!J%"J)""2JJ)&1-3)&5
+Ur`)%#(H*MiphQ2Mi!!J8+P8U&!J!N-bj!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!1X!#XB##!!(`!3!3!a'fJ$V!!T#!aJ!"#!!!%!3!YS!m!!3"`$Lc$K#!UMKa#1
+-@1!i`KcE!2!!%!L"%c*%3J**%L3N4'4!%%)Lf`$`!"!(J3)L2%)##2)(`m4%3""
+#)YX!m!!3#)$L)N4#!JN5"!4%4%!33MlE!2!!%!L!%L*%3J)*%J3%4%4!%%)Jf`$
+`!"!)J4)L4%)##4)N"%4%3""#)YX!m!!3"i$L)Ma#!JMaa!2%4$!33KcE!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!mJ$fr`$Je!$b!2EG!1$8!2)!!2IhG`"Je!$
+b!2EG!1$8!2)!!2IhG`"Je!$b!2EG!1$8!2)!!2IhG`"Je!$b!2EG!1$8!2)!!2I
+hG`"Je!$b!2EG!1$8!2)!!2IhG`"Je!$b!2EG!1$8!2)!!2IhG`"Je!$b!2EG!1$
+8!2)!!2IhG`"Jr!!!"rEr!2cQ!2)!pYd!i2`!!"hfh3$IjJ$b!!$hphF!B2`!!$I
+eG`#!j`$b!2EG!1$m!!"GpGd!`1F!mJ!!prGh!'$m!!$hpAF!B1F!mJ$fh3$Jr!$
+dh3$Jj`$b!!$hphF!B2d!!!(dG`"`j`$b!2EG!1$p!!!"p0d!d1F!mJ!!prGh!'$
+p!!!"p(F!F1F!mJ$fh3$Jr3!!!I6G!0$R!2)!!2IhG`"Jr3!!!I4h!($R!2)!pYd
+!i2d!!!(dh3$3j`$b!!$hphF!B2d!!!(dG`"`j`$b!2EG!1$p!!!"p0d!d1F!mJ!
+!prGh!'$p!!!"p(F!F1F!mJ$fh3$Jr3!!!I6G!0$R!2)!!2IhG`"Jr3!!!I4h!($
+R!2)!pYd!i2d!!!(dh3$3j`$b!!$hphF!B2d!!!(dG`"`j`$b!2EG!1$p!!!"p0d
+!d1F!mJ!!prGh!'$p!!!"p(F!F1F!mJ$fh3$Jr3!!!I6G!0$R!2)!!2IhG`"Jr3!
+!!I4h!($R!2)!pYd!i2d!!!(dh3$3j`$b!!$hphF!B2d!!!(dG`"`j`$b!2EG!1$
+p!!!"p0d!d1F!mJ!!prGh!'$p!!!"p(F!F1F!mJ$fh3$Jr3!!!I6G!0$R!2)!!2I
+hG`"Jr3!!!I4h!($R!2)!pYd!i2d!!!(dh3$3j`$b!!$hphF!B2d!!!(dG`"`j`$
+b!2EG!1$p!!!"p0d!d1F!mJ!!prGh!'$p!!!"p(F!F1F!mJ$fh3$Jr3!!!I6G!0$
+R!2)!!2IhG`"Jr3!!!I4h!($R!2)!pYd!i2d!!!(dh3$3j`$b!!$hphF!B2d!!!(
+dG`"`j`$b!2EG!1$p!!!"p0d!d1F!mJ!!prGh!'$p!!!"p(F!F1F!mJ$fh3$Jr3!
+!!I6G!0$R!2)!!2IhG`"Jr3!!!I4h!($R!2)!pYd!i2d!!!(dh3$3j`$b!!$hphF
+!B2d!!!(dG`"`j`$b!2EG!1$p!!!"p0d!d1F!mJ!!prGh!'$p!!!"p(F!F1F!mJ$
+fh3$Jr3!!!I6G!0$R!2)!p[m!i2d!!!(dG`"`j`$L!!!"p0d!d1F!iJ!!!I4h!($
+R!1)!!!(dh3$3j`$L!!!"p(F!F1F!iJ!!!I6G!0$R!1)!!!(dG`"`j`$L!!!"p0d
+!d1F!iJ!!!I4h!($R!1)!!!(dh3$3j`$L!!!"p(F!F1F!iJ!!!I6G!0$R!1)!!!(
+dG`"`j`$L!!!"p0d!d1F!iJ!!!I4h!($R!1)!!!(dh3$3j`$L!!!"p(F!F1F!iJ!
+!!I6G!0$R!1)!!!(dG`"`j`$L!!!"p0d!d1F!i3!!pr9h!'$R!1%!p0d!i1F!i3$
+dG`"!j`$K!!!ppGd!J1F!i3!!(r9hjJ$K!!!(p[m!r1B!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3$V!!V'!JJ!"m!%!%!-4YS!k`!+3J-B!!3J!!"!%!,
+D!2!!%!F!iX`i3J+SiF3MM&MJ1-)Ff`$`!"!)J4-b4%)#54)N*%4N3""#)YX!m!!
+3"i%#)Ma#!JMb"m2%4%!33L,E!2!!%!L!iL*%3J)*%J3%4%4!%%)qf`$`!"!)J")
+L4%)##4)%"%4%3""#)0X!m!!3#)%5)N4#!JN5*!4%4%!33L,E!2!!%!H!iL)m3J)
+)mF3$a%3`%%)Ff`#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3"m83!!:
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/MacPaint_2.0.hqx b/writerperfect/qa/unit/data/draw/libmwaw/pass/MacPaint_2.0.hqx
new file mode 100644
index 000000000..57aa231da
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/MacPaint_2.0.hqx
@@ -0,0 +1,116 @@
+(This file must be converted with BinHex 4.0)
+:#R"KD@jd-LjYBh!!8%j84de36P3"!!!!&"N!!!(ejl0`#l"Yrj!)hIphrphrGrr
+GGpehhAIGGkT9UP@U9DT99Ip9reAr9IqUN!MZhEYhlYflGiL3#,%`!a[B`!b0J"!
+#)!%)3!6rL)L)riL)L2q!J)$r#!J)J!#3"i"!)!!#"!J!JN3j4))"!3(iG#*(MaF
+LF9@J3%"9#J3%)&#)N!3&!Vm![lq`N!3!N!L!!!J!J!!)!)J!)J#)!#)!L#+))SJ
+LL#+U!+S!UJ#U!2m!r`$r!2m!%5*%L"%L4)Mr!!!!r`!!!!%#"!J3)%#!UJ#!!)J
+!J!$rJ*!(#"`L`B!"!J5)&#*"L!#U!%#J!!!%#J!!!i4)-!`#!3'!J%%q#!J8ia!
+J9+Vr!J3)GiQ2MhHBq2J!#"3U95S8#%KZr+4)E[bS2c`!5+M23HlmV#!Zr+L3!)J
+Y32kX3QF`,HBk8d""lHBm`I`#AN(S!L3r-!!!5'lqV%KZr+a1V3,51erriL!ZrUc
+4V[4q5QhriQF33QFr,IrL,`j1Z[A529rrrP5Zr+48V[bS8QldS!aZ!Y$dS'q#-#h
+Q1P0!3HhQ2-(m!Pj"k!)F-M!!!,*ZrlT@`$)YjMT638(YjMc$r!*H3HJ#(M3`%!#
+dE[qm9X'!!5m!3QFb,HBk8d&"lHBm`r`#AN(S!Ga)F"!!5'fj!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!1X!#XB##!!(`!3!3!a'fJ$V!!T#!aJ!"#!!!%!3!YS!m!!
+3"`$Lc$K#!UMKa#1-@1!i`KcE!2!!%!L"%c*%3J**%L3N4'4!%%)Lf`$`!"!(J3)
+L2%)##2)(`m4%3""#)YX!m!!3#)$L)N4#!JN5"!4%4%!33MlE!2!!%!L!%L*%3J)
+*%J3%4%4!%%)Jf`$`!"!)J4)L4%)##4)N"%4%3""#)YX!m!!3"i$L)Ma#!JMaa!2
+%4$!33KcE!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!mJ$fr`$Je!$b!2EG!1$
+8!2)!!2IhG`"Je!$b!2EG!1$8!2)!!2IhG`"Je!$b!2EG!1$8!2)!!2IhG`"Je!$
+b!2EG!1$8!2)!!2IhG`"Je!$b!2EG!1$8!2)!!2IhG`"Je!$b!2EG!1$8!2)!!2I
+hG`"Je!$b!2EG!1$8!2)!!2IhG`"Jr!!!"rEr!2cQ!2)!pYd!i2`!!"hfh3$IjJ$
+b!!$hphF!B2`!!$IeG`#!j`$b!2EG!1$m!!"GpGd!`1F!mJ!!prGh!'$m!!$hpAF
+!B1F!mJ$fh3$Jr!$dh3$Jj`$b!!$hphF!B2d!!!(dG`"`j`$b!2EG!1$p!!!"p0d
+!d1F!mJ!!prGh!'$p!!!"p(F!F1F!mJ$fh3$Jr3!!!I6G!0$R!2)!!2IhG`"Jr3!
+!!I4h!($R!2)!pYd!i2d!!!(dh3$3j`$b!!$hphF!B2d!!!(dG`"`j`$b!2EG!1$
+p!!!"p0d!d1F!mJ!!prGh!'$p!!!"p(F!F1F!mJ$fh3$Jr3!!!I6G!0$R!2)!!2I
+hG`"Jr3!!!I4h!($R!2)!pYd!i2d!!!(dh3$3j`$b!!$hphF!B2d!!!(dG`"`j`$
+b!2EG!1$p!!!"p0d!d1F!mJ!!prGh!'$p!!!"p(F!F1F!mJ$fh3$Jr3!!!I6G!0$
+R!2)!!2IhG`"Jr3!!!I4h!($R!2)!pYd!i2d!!!(dh3$3j`$b!!$hphF!B2d!!!(
+dG`"`j`$b!2EG!1$p!!!"p0d!d1F!mJ!!prGh!'$p!!!"p(F!F1F!mJ$fh3$Jr3!
+!!I6G!0$R!2)!!2IhG`"Jr3!!!I4h!($R!2)!pYd!i2d!!!(dh3$3j`$b!!$hphF
+!B2d!!!(dG`"`j`$b!2EG!1$p!!!"p0d!d1F!mJ!!prGh!'$p!!!"p(F!F1F!mJ$
+fh3$Jr3!!!I6G!0$R!2)!!2IhG`"Jr3!!!I4h!($R!2)!pYd!i2d!!!(dh3$3j`$
+b!!$hphF!B2d!!!(dG`"`j`$b!2EG!1$p!!!"p0d!d1F!mJ!!prGh!'$p!!!"p(F
+!F1F!mJ$fh3$Jr3!!!I6G!0$R!2)!!2IhG`"Jr3!!!I4h!($R!2)!pYd!i2d!!!(
+dh3$3j`$b!!$hphF!B2d!!!(dG`"`j`$b!2EG!1$p!!!"p0d!d1F!mJ!!prGh!'$
+p!!!"p(F!F1F!mJ$fh3$Jr3!!!I6G!0$R!2)!p[m!i2d!!!(dG`"`j`$L!!!"p0d
+!d1F!iJ!!!I4h!($R!1)!!!(dh3$3j`$L!!!"p(F!F1F!iJ!!!I6G!0$R!1)!!!(
+dG`"`j`$L!!!"p0d!d1F!iJ!!!I4h!($R!1)!!!(dh3$3j`$L!!!"p(F!F1F!iJ!
+!!I6G!0$R!1)!!!(dG`"`j`$L!!!"p0d!d1F!iJ!!!I4h!($R!1)!!!(dh3$3j`$
+L!!!"p(F!F1F!iJ!!!I6G!0$R!1)!!!(dG`"`j`$L!!!"p0d!d1F!i3!!pr9h!'$
+R!1%!p0d!i1F!i3$dG`"!j`$K!!!ppGd!J1F!i3!!(r9hjJ$K!!!(p[m!r1B!Z3#
+j!,N!Z3#j!,N!Z3#j!,N!Z3#j!1i!!"hph3$FdJ$[!!(`IrcrdJ$`!!%"FIYhl3!
+!F1F!m!!!!r[r!2lY!!$qj`$`!!)"hGrpr`$`r!!"!F$e!!)"hG$S!2!!!J2r`2k
+!qJ!"!q$e!!)$rrMS!2!!!30hrB$k!!%$F28!!J0(GqJ!m!!%!I`!J)$j!!%$r28
+!!`I$rm$T!1m!!"cf!!%"h28!!`f!(G$T!1m!!(cf!!)$ri$f!!-2!!rmk3$[!!"
+`pJ!#!dG!pJ!$"`!"GqN!l`!!H2B!!J2(m2B!"!m!!(q!kJ$[!!"BpJ!#!F(Br!!
+!%2`!"%d!!"h!kJ$[!!"ipJ!#!m$qr!!!H2`!"2m!!!IJkJ$[!!"`pJ!#!d"hr!!
+!F2`!"(F!!!&`kJ$[!!"ipJ!$!m!I`2d!!(Mm!!$rrJ!!r1S!l`!!@2B!!`(!$F$
+p!!"Br!!!hIi!!&cU!1m!!2Mf!!-$`!2`r3!!H2`!!2rq!!!rkJ$[!!"`pJ!$!d!
+"G2d!!($m!!"frJ!!"qS!l`!!m2B!!`2!!(lp!!"ir!!!m2i!!3q!k`$[!!$3pJ!
+%!F!!(B$q!!"Br!!!d2i!!3@!k`$[!!$`pJ!%!m!!(m$q!!"ir!!!m2i!!3H!k`$
+[!!"`pJ!%!d!!"f$q!!"`r!!!F2i!!3G!k`$[!!$`pJ!%!m!!!rMq!!"ir!!!m2i
+!!32!k`$`!!%"d2B!"!(!!!$FrJ!!@2`!!0$q!!%"`1X!m!!"!H$f!!3$`!!!Iri
+!!(Mm!!$`rJ!"!H$V!2!!!3&JpJ!%!d!!!$Iq!!"`r!!!F2i!!3&`k`$`!!%"i2B
+!#!2!!!!2`!!!H2`!!2$p!!$`k`$`!!%"`2B!#!(!!!!&d!!!@2`!!0$p!!$Bk`$
+`!!%$i2B!#!2!!!!"q!!!H2`!!2$p!!"ik`$`!!%$32B!!30!rJ!$G!!!F2`!!($
+p!!"dk`$`!!%$`2B!!32!rJ!$I`!!q2`!!2$p!!!mk`$`!!%"`2B!!3(!rJ!$(B!
+!d2`!!0$p!!!Gk`$`!!%$`2B!!32!rJ!$$m!!m2`!!2$p!!%IJ1`!m!!"!d$f!!%
+$32i!!`G`!($m!!"`r3!""d$X!2!!!32!pJ!"!m$q!!-"q!$`r!!!m2d!!3IJl!$
+`!!%"`2B!!3(!r3!#h!$3r!!!d2d!!3(Bl!$`!!-(rrrJq!!"!m$p!!*r!2$m!!$
+`r!!!r1`!m!!!"rjh!($j!!%$32d!!KF!F2`!!($m!!"hl!$`!!!(r2m!r[X!!32
+!r3!#$m$`r!!!m2`!!6r!l3$`!!%&RIcGq`!"!F$p!!)&d0$m!!$3r!!"$G$Y!2!
+!!`H!!$rqrrX!!32!r3!#!IM`r!!!m2`!!3Iml3$`!!!(rJ!#"hGfq`!"!d$m!!&
+eF2`!!($m!!%"GZd!m!!""i$f!!%$`2`!!ArJr!!!m2X!!(rY!2!!!3@!pJ!"!F$
+m!!%G`2`!!0$l!!!Gl3$`!!%(J2B!!32!r!!"$q$m!!$`q`!!$qd!m!!!"r8!!30
+!r!!""f$m!!"`q`!!&qd!m!!!$r8!!32!r!!"!r$m!!$`q`!!(Zd!m!!!$I8!!3(
+!r!!"!GMm!!$3q`!!(1d!m!!!$r8!!32!r!!"!Icm!!$`q`!!21d!m!!!"r8!!30
+!r!!"!AEm!!"`q`!!G1d!m!!!$r8!!32!r!!"!Irm!!$`q`!!H1d!m!!!(I8!!3(
+!r!!"!Fhm!!$3q`!!@1d!m!!!([8!!32!r!!"!qrm!!$`q`!!q1d!m!!!&[8!!30
+!r!!"!dEm!!"`q`!!F1d!m!!!([8!!32!r!!"!m$m!!$`r!!"!I$Y!2!!!"ce!!%
+"`2`!!3(!r!!!d2`!!3(!l3$`!!!Hp3!"!m$m!!%$`2`!!2$m!!%$i1d!m!!!0[8
+!!30!r!!"!d$m!!"`r!!"!d$Y!2!!!$ce!!%$`2`!!32!r!!!m2`!!3I!l3$`!!!
+Fp3!"!F$m!!%"`2`!!0$m!!%&J1d!m!!!228!!32!r!!"!m$m!!$`r!!"$i$Y!2!
+!!$6e!!%$32`!!30!r!!!F2`!!!IX!2!!!$ce!!%$`2`!!32!r!!!m2`!!!rX!2!
+!!"ce!!%"`2`!!3(!r!!!d2`!!"hX!2!!!$ce!!%$`2`!!3I!r!!!m2`!!"lX!2!
+!!$6e!!%$32`!!!Il!!"`r!!!&Z`!m!!!2r8!!32!r!!""i$m!!$`r!!!2Z`!m!!
+"(B$f!!%"`2`!!3@!r!!!d2`!!"cX!2!!!3r!pJ!"!m$m!!%(J2`!!2$m!!!ml!$
+`!!%(32B!!30!r!!!"rX!!($m!!"dl!$`!!%$`2B!!32!r!!""i$m!!$`r!!!H1`
+!m!!"!F$q!!-&hGh!r3!"!F$m!!%&J2`!!0$m!!$Bl!$`!!3$`!!!(rlr!1$p!!%
+$`2`!!3H!r!!!m2`!!2$X!2!!!!2kG`"Jr3!"!d$m!!!(q`!!F2d!!3&`l!$`!!!
+$q[m!`2d!!32!r!!""i$m!!$`r3!"!H$X!2!!!!(ph3$FqJ!"!F$m!!%&J2`!!0$
+p!!%"`1`!l`$qr`$`q3!"!m$m!!%(J2`!!2$p!!%$i1`!l`!!B2B!!30!r!!!"rX
+!!($p!!%$31`!i`!"!m$m!!%(J2`!!2$p!!%$`1`!i`!"!F$m!!%&J2`!!0$p!!%
+"`1`!i`!""m$m!!%(J2`!!2$p!!%(`1`!i`!!"rX!!!Il!!"`r3!!"qX!i`!"$i$
+m!!%(J2`!!2$p!!%(J1`!i`!"$B$m!!%&J2`!!0$p!!%&J1`!i`!"$i$m!!%(J2`
+!!2$p!!%2J1`!i`!!"rX!!!Il!!"`r3!!"qX!i`!!"[X!!3H!r!$lrqX!h!!""B$
+m!2[Gk`$F!!%(J2`!qrrV!0`!!!Il!2ah!(EV!0`!!3H!r!!!m1B!h!!""B$m!!"
+!jJ$F!!%(J1!!h!!!"pm!h!!""i$J!0`!!3@!i!$F!!%(J1!!h!!!!pm!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N!Z3#j!,N
+!Z3#j!,N!Z3#j!,N!(iJ!!!%!!!!"RJ!!!*i!!!"A)%G%)%&38%`"!*!A#R"KD@j
+d-LjYBh!!!J!!!&"19%G08%j8!*!+8%j84de36P3!N"M2Y*d&!*!'!I8!N!`#RL8
+"6Np"68&38%`"!*!G!8iP!90*9'96594-"3#3(3(6*3&KG'0[4hTTF2m!N"JH!#J
+!"!(8!Fm!#!&l!!N!d3$J!KF!+!"l!*!%!H%!!!"ijDSr2!!#,a5T4d*R6Ud!`K!
+IC`!!e(i"B"``"e0!3HhQ2-(m!Pj"k!*1%M!!!'F%1dINL&*(F!Q`4fcH2@hNL2f
+iIJ&J!!#B-!G63%(YjMc"r!*H3HJ#6K)`!!"R)M!(8d""lHBm`I`#AN2Zrlj&k!(
+F3I)!!(!2!!!"!!!!!Ci!!!#H!!!!9`"K+-`BqJ!!!"`!4J!"8&*&4J!!!"*38N9
+$!!!!(J#!!*!(BD!B!)%!#3!!!#)!BD!F#%4[Be"bC@Cc"d4[Be"bC@-5E3:
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/MicrosoftWorks_3.0.hqx b/writerperfect/qa/unit/data/draw/libmwaw/pass/MicrosoftWorks_3.0.hqx
new file mode 100644
index 000000000..ab761cd8d
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/MicrosoftWorks_3.0.hqx
@@ -0,0 +1,27 @@
+(This file must be converted with BinHex 4.0)
+:#@4bBAFc,QecG`""9d45690A5`%!!!!%`!!!!8C')3!!!!N!+`!%!Gi#2J#3"3`
+!N!B)!*!)$`!!!%J!5!#3"!,`!N$rmIrZ!`N#8Q-#"5J$r!%!!!!"D!&S!*!%$V!
+,3!!"!3!!C!!"!!!!!3!#!!!!!5F2!!%!N!i3!*!*%!$rYIqQ$bd,QJ!)!3#3$4N
+"!(J!H!"i!(J!N!F"!!%!N"%"!!%!!!!"!!!$qJ!!!!8!N"%-!!%!@`!1$k-!&3q
+K'eJ!![rr!!%!"J!)rrrrh[rrrr!!N"3%HJ#3"43!!!!$!!`!!`#3"3%!!3#3"3%
+!!3##!"0T+!!!q9)!Gj1)!!!C@!"hN3!!GiC`!!$el!#3"KRr!(DF!!!!m3B!Gj@
+)!!!C@!#3"2q3"!!!"YX!!2rr!"0T+!!!'Im!GT`!N!J&!JK!J+Nb!*!(D+Kk!!!
+BqN#!lU`!!)4D!&FLQ!!ibp3!N!PSkjiJ!!"Q!'B!8mr-!'LTcN#!lU`!!)4D!'M
+[2!!ic(B!N!PSkjiJ!!"Q!'EK$!!!"-!!!!Drrrrrq`#3"@MVRJ"6cm`!D1ZH!'P
+9'J"SUKB!9Z4Srrrrq`!!!!)!8m()!'LU(J"@j+`!#!!#!!%!@!"B$k-!&3"N$k-
+!N!8"!!%!#2rrrpMrrrr`!&m!!!"-!!!"6J!!!)d!!!!8!!!%!`!!#3!"!-!!AJq
+M!!X!C!#3"@3!!3!"!!Mrrrr3rrrri!#"!!!!D!!!!8(ra3"i!*!'"!F!N"SF!!%
+!!3"6[#J!8leNq*!%!&1lk!#3"4hrr`!!!")!!3!3!!`!!`!!!!`4N!B!!!!)!"!
+!$!!3!!`!!!!)pj!%!&1lr!!!!"B!N!F3!!`!!`!!!!crrjQC-c-!!!!F35"cD@e
+`E'8J6@PMFQpcEfCd9fpbDh-JC(*KG`!#!!%!@`!1!*!%rrmE@!!#rrm!!3!'!!M
+rrrrBrrrrm!"0!!!!X!!!!1X!!!%J!!!!&!!!"'!!!!)!!3"E!!i2S`!9$k%E@!!
+#rrm!!3!'!!MrrrrBrrrrm!%E!!!!XJ!!!E!!!!%C!!!!&!!!"'8!N!3"!&X!$Jq
+M!"82S4YB!!,rr`!"!!B!#2rrrpMrrrr`!*3!!!#[!!!!d!!!!)i!!!!"!!!%D3#
+3"!%!@`!1$k-!&3qK'eJ!![rr!!%!"J!)rrrrf2rrrr!"B!!!!+i!!!%K!!!!MJ!
+!!!%!!!4X!!!&!!%!@`!1$k-!&3qK'eJ!![rr!!%!"J!)rrrrf2rrrr!!S`!!!5X
+!!!%e!!!"IJ#3"J4d!*!%"3"6[-!!h!!!!@d!!!%#!!!"IJ!!!68!!!&9!!!!jJ!
+!!5X!!!#M!!!"E!#3"3%!@`!1$k-!&3qK'eJ!![rr!!%!"J!)rrrrf2rrrm!"-3!
+!!6N!!!%N!!!!N!!!!!!"!!!%GJ#693!!!3!!!!%8!!!!&!!!!$*59%G%8P434JB
+!N"F*C(*KGc-ZEA0h!J#30mqdj*i!N!B"4J#3$!)e*3&59lNh4&"54J)!N"lG*3&
+5C@GT39"36!)!N"d"L58"8Q9i,N&38%`"!*!B%!p0D@0bEh0[CR3J9fpbDh-!!!%
+!!!!"&!!!!"3!!!!b!&2(8"PB!!!!(!!b!!"69&)J!!!!#Vrdrrm!N!96Zq$0QJ:
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/MicrosoftWorks_4.0.msw b/writerperfect/qa/unit/data/draw/libmwaw/pass/MicrosoftWorks_4.0.msw
new file mode 100644
index 000000000..d2ab02e32
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/MicrosoftWorks_4.0.msw
Binary files differ
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/SuperPaint_1.0.hqx b/writerperfect/qa/unit/data/draw/libmwaw/pass/SuperPaint_1.0.hqx
new file mode 100644
index 000000000..a7d04718a
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/SuperPaint_1.0.hqx
@@ -0,0 +1,27 @@
+(This file must be converted with BinHex 4.0)
+:#'4bBAFa,R0`!&039%G68%j8!*!%!fJ!!!9ZASN3!*!+!J#3HL3"!!%!(&La!*$
+r!*"d-J"9!AB!f`)N!*!*(!%"!3!!,!!"!!(rN!M`N!32N!3%!3%1!&S!-J"E!+8
+!QJ%i!*!*(3%"!!!!@`!"!!(rN!M`N!32N!3%!3"5$c3!!!!Q!#B!@`#P!*N"0`"
+H!-)!GJ#P!*N!h`"e!6F!@`%$!'`!hJ"H!-)!-J"B!$X!N!!!H`#3#4S"!3!!!,3
+!!3!"rj!)m*!%$j!%"!%!N!8b!$m!8`!r!6B!N!NB!*!&"`!$!!2rN"!%!3#3"8S
+!(J"9!$J#'!#3#4F!N!F"!!'U9DT9UP@U93#3#!3"!&&SG!!$!!`!#!!!!!`!%3#
+3$aa")&0eF'9b8'&TER3J9Q9MG'pb)%4[Bh9YC@jd!!#UD3!!!3!!!!8B!!!%'!!
+!!&B!!3j'39"362d!N"F)C(*KGc%ZFh!!!J!!!&039%G68%j8!*!-8e"84e036P3
+!N"M2Y+M&!!!$D!!!"@i!N!d2!*"f!3)!)!%"%"!"!4!3c!!!!$-!!!!4)N3!%5*
+%!%3L!)K%)J#)m*!%$j!%Q@CQQCPQCTN!#"`qIciF#!!)&#T9+K3)X6!$'pM!$)f
+!%!)J!3K!"!J8)N'!!3)%J-!K%J`%!J(rJ)#!r`J)#!"rIhm!prIhJ%!J!!)%#!#
+#4$P%JJ%"!I"i*%+($a)K%#"8U[m#"!MiG#*(MaFLFEqJ[lfpr3Ap)&#)N!3&!P@
+J3%"9#J3%L%3L%4%L4)L"3L3BJ8)N'+S!J!#)!)!!!i4)-!`#!3'!J%%q#!J8ikp
+IVem0#`d,GiQ2MhHBq2L)&#*"L!#U!%#J!!!%#J!![`#r[l#3"!!!!3)!)(rrrrr
+hrrrrIrrhrhrrprphrrrrGrrrrhIrhIphrphr9IrGreArhIp9rqlr9IqlreAr9Ip
+9reArGpehhAIGGpe9[eAr9IY9re@l9Ip9ZeAr9Ep9lPAl9Hj9ZeAZ9EY9lP@l9HT
+9Ze@Z9ET9Ue@k9DY9kP@U9Dj9UUT9UP@U9DT9UK@U9DT4UP@U4DT8UN@U9+T%UK@
+U4+T4UN5U%DT%UK'U3+S4UJ5U%DT%UJ#U4+S!UN#U!+S%UJ#))SJLL#+))US!UJ#
+U!+S!UJ!4!+S!4!#U!#)!UJ!L!)J!)J#)!#)!L!!J!)J!!J#!!!J!J!!)!)J!!!#
+)!!!!J!!!!!J!N!8"!J!J!*$r!!!!!3)!)+U3#!$r!2m!r`$rL*!)Gj!)r`!!!2m
+!N!6rrrm!rrrrJ*!)Ij!)r`#3#2q3"mb3#2rr!!$rr`!!riL)L2q)L)J!GhGh!(G
+hGrq!N!F!Ij!(L%3L%BK%)K&hZphZGl[GlK%L4)J4)N5)lYflGqlGZhH!3#!3#!3
+#!Aqrhqrhqrhq!3)%#"!J3)$qrI[hlpqrIq"`1"`1"i2"QFaQ-jR-CM1$"`iF1($
+J`60Qc*NcCXbCJ8)N'"JN3S&q[G[RjpZpIS*%+"!S4))"IE[AlpHlIIi!!!%!!!!
+&'!!!""J!!!"@!&&Rr"Qf!!!!(!"@!!"3393M!!-!#J$krrm!N!95$U3""2rr!!!
+""J"5$d3"'2rr!!!#$!"5$`3"$[rr!!!$%J"5$`JQ#`:
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/SuperPaint_P_1.0.hqx b/writerperfect/qa/unit/data/draw/libmwaw/pass/SuperPaint_P_1.0.hqx
new file mode 100644
index 000000000..6a1dc5009
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/SuperPaint_P_1.0.hqx
@@ -0,0 +1,71 @@
+(This file must be converted with BinHex 4.0)
+:#A"KD@jd-5jcF!"68&4(8e"19!#3"!UX!!!&E[`,%!!!&J!q!)-"l3!"!*"k*!%
+!!3!F@,%!N2m!N(-4!D"L$+!!MJ%!#J#3"!,3!N#B!$J!&J!i!%m"m!!@!$i!6`(
+Y!"B!2J"2!Hd!!3VX!!!Jp`!!#1S!(`3!!!)!H2i!"4m!%!%!m2`!"J%!3!!)#%$
+l!!!%kJ!I"!!!!J#%rJ!&%)!!!3#)r!!'!3"!!!J!32X!!!6U!#3J!!!&!)#*iFA
+3MM&MJ)4`iL@BF@1!J$J2'1,-12!1,$J#kJ!N)!!!"3#!L4)Q%*%4N3#%L4)QC)Q
+4!)"%#)K$-N5)%6*%!ZS!*#!!!!L!H)N5*"m2%4%!K)N#*%5*%3#!2!L)3L)mL"%
+L4!,U!#3)!!!)J!5*%q33rK%8!)5*!L4%q4%!J%3)L%)L4)J4)R`#kJ!N#!!!(m!
+%L4)%%2i4&!#%L3)N4)%4!)"%#)K#)N5)%5*!!ZS!*!J!!""!K*N5*"$q%43!L)N
+5C%5*%3"!4!L)3L*%L"%L4!6U!#3J!!!33(KTiF33$a%3`2"`iD4%F4$!3$`2#$)
+L22!1)MJ%kJ!5r!!!!I)!!#$l!!#!rJ!!#1S!#[`!!!(V!!#!jJ!#b3!#b3!#b3!
+#b3!#b3!#b3!#b3!#b3!#b3!#b3!#b3!#b3!#b3!#b3!(!3!2m2rF!!N"!$M`#!$
+!h3!0!3"Fm"`!)1!!!Mri!!i"!,l`2J!`i3!$2m*!!"B!!Hpr!(Mq!!"rpIm!q2-
+!"!IRKi!!&J!"lci!12i!!%re$`!)m`!%I`m2#!!9!!,Z(2i!!&,e%J!Bp!!&"j)
+5%K!!&`!#l`J!$2i!!'(e)3!Sp!!!1IiK!5!!&J!#l`!!"2i!!($em!$ip3!!!Ic
+`!!!5!!,[#!!-rJ$cH28!!!lmH!!!&3!#lKcq!!"Np53!+28!!$cp*!%J!"8!!Zm
+q!$cq!24#!%Me!!$#r8)"3!!A!!2[I`"mrJ!!4r@(!)Mf!!!$r)F"J!!9!!,[2J!
+mrJ!!6r82!!Mf!2X2!3J!&3!#lKcq!!"5p4)!'2B!!$,m%J%3!"F!!Zm)!!cq!!"
+Kp5%!+2B!!1(m)3%J!"B!!Zm!!!6q!!"`pI!!q2F!!!2km!!!%J!#l`J!$2i!mhM
+h!!!-qRJ!!"8!!ZiFrJ!!C28N!#Mh!!!Fqb3")!!9!!,[2J!mrJ$d3J")p`!!B[Y
+#!8!!&`!$lhm!I2i!!%IeK`#)p`!!arZ(!B!!&`!#lci!22i!!%re$`!)q!!!!rS
+2!3J!&3!#lKcq!!"5p4)!'2J!!!Ek%J%3!"F!!Zm)!!cq!!"Kp5%!+2J!!!Rk)3%
+J!"B!!Zm!!!6q!!"`pI!!q2J!!"$jm!!!%!!#l`J!$2i!mhMi!2Ki!!!9!!,Z(2i
+!!'6e*!!Sq!!!j2SN!5!!&J!#lci!22i!p%)!52N!!3(#qN)"3!!A!!2[I`"mrJ!
+!4r@(!)Mj!!!$qBF"J!!A!!,[2J!mrJ!!6r82!!Mj!!!(q3m"#!!9!!,Z(2i!!&,
+e%J!Bq3!!#[N5!4!!Q!!i!%m!1!#$!I!!6`!q!)-"l3"2!$i!J`(Y!!%A!!,[#!!
+-rJ!!BI8K!#Mj!!!4q5%")!!@!!,[!!!%rJ!!F2A`!2Mj!!!`q2!!!"!!!Zm)!!c
+q!20iq3$hH!!!&3!#lKcq!!"Np53!+2N!!16j*!%J!"8!!Zmq!$cq!24#!%Mj!!$
+#q8)"3!!A!!2[I`"mrJ!!4r@(!)Mk!!!"q)F"J!!A!!,[2J!mrJ!!6r82!!Mk!!!
+$q!m"#!!9!!,Z(2i!!&,e%J!BqJ!!"[J5!4!!&`!#l`J!$2i!!'(e)3!SqJ!!$IJ
+K!5!!&J!#l`!!"2i!!($em!$iqJ!!#2I`!!!5!!,[#!!-rJ$cH2S!!"MhH!!!&3!
+#lKcq!!"Np53!+2S!!$6i*!%J!"8!!Zmq!$cq!24#!%Mk!!!Lq%)"3!!A!!2[I`"
+mrJ!!4r@(!)Mk!!"(q)F"J!!A!!,[2J!mrJ!!6r82!!Mk!!"2q!m"#!!9!!,Z(2i
+!!&,e%J!BqJ!!N[J5!4!!'!!#l`J!$2i!!'(e)3!Sq`!"!D(i)3%J!"B!!Zm!!!6
+q!!"`pI!!q2X!!!(fm!!!%J!#l`J!$2i!mhMl!!!$pRJ!!"8!!ZiFrJ!!C28N!#M
+l!!!#pb3")!!9!!,[2J!mrJ$d3J")q`!!![G#!8!!&`!$lhm!I2i!!%IeK`#)q`!
+!"rH(!B!!&`!#lci!22i!!%re$`!)q`!!"rF2!3J!&3!#lKcq!!"5p4)!'2X!!!V
+h%J%3!"F!!Zm)!!cq!!"Kp5%!+2X!!!Rh)3%J!"B!!Zm!!!6q!!"`pI!!q2X!!!M
+fm!!!%J!#l`J!$2i!mhMl!!!BpRJ!!"8!!ZiFrJ!!C28N!#Ml!!!8pb3")!!9!!,
+[2J!mrJ$d3J")q`!!%[G#!8!!&`!$lhm!I2i!!%IeK`#)q`!!*rH(!B!!&`!#lci
+!22i!!%re$`!)q`!!,rF2!3J!&3!#lKcq!!"5p4)!'2X!!$,h%J%3!"8!!Zm)!!c
+q!!"Kp5%!+2X!pL%")!!@!!,[!!!%rJ!!F2A`!2Ml!!"`p[!!!"!!!Zm)!!cq!20
+iq`$eH!!!&3!#lKcq!!"Np53!+2X!!'6h*!%J!"-!!Zmq!$cq!24#!%Ml!2C#!8!
+!&`!$lhm!I2i!!%IeK`#)q`!!4rH(!B!!&`!#lci!22i!!%re$`!)q`!!MrF2!3J
+!&3!#lKcq!!"5p4)!'2X!!*,h%J%3!"F!!Zm)!!cq!!"Kp5%!+2X!!+(h)3%J!"3
+!!Zm!!!6q!!"`pI!!q2X!pI!!!")!!Zm)!!cq!20iq`!!q2Ci!!!9!!,Z(2i!!'6
+e*!!Sq`!!T2FN!5!!&3!#lci!22i!p%)!52X!!-,h3J&!!"8!!qpr!(cq!!"rpIm
+!q2X!pSF"J!!)!!([2J!ih3!)!!([(!!Bh3!*!3#)m!J!%0d!#3%!32!!!#$G!!N
+"!$M`#!$!h3!(!3!2m2rF!+!!Mrm!!$TX!!!"!!!!"4J!!!3B!!!!9P*cE(C"8&"
+-!3#3"JC0!J%!#`&5Ffaf8R0$8`%!#A"KD@jd-5jcF!)!!!"68&4(8e"19!#3$&0
+39%G68%j8!*!Bcl5SF`!!#U`!!!9Z8R0XGP*c9h-"!*!'"Ni#!3!,!9*cE(C5FeG
+c!3#3"JC1!J%!#`&5Ffaf8R0AF`%!N!B'6J)"!!X"8R0XGP*c9h-"!*!'"Ni#!3!
+,!9*cE(C5FeGc!3#3"JC1!J%!#`&5Ffaf8R0AF`%!N!B'6J)"!!!!!3)!)!%"%"!
+"!4!3c!!!!$-!!!!4)N3!%5*%!%3L!)K%)J#)m*!%$j!%Q@CQQCPQCTN!#"`qIci
+F#!!)&#T9+K3)X6!$'pM!$)f!%!)J!3K!"!J8)N'!!3)%J-!K%J`%!J(rJ)#!r`J
+)#!"rIhm!prIhJ%!J!!)%#!##4$P%JJ%"!I"i*%+($a)K%#"8U[m#"!MiG#*(MaF
+LFEqJ[lfpr3Ap)&#)N!3&!P@J3%"9#J3%L%3L%4%L4)L"3L3BJ8)N'+S!J!#)!)!
+!!i4)-!`#!3'!J%%q#!J8ikpIVem0#`d,GiQ2MhHBq2L)&#*"L!#U!%#J!!!%#J!
+![`#r[l#3"!!!!3)!)(rrrrrhrrrrIrrhrhrrprphrrrrGrrrrhIrhIphrphr9Ir
+GreArhIp9rqlr9IqlreAr9Ip9reArGpehhAIGGpe9[eAr9IY9re@l9Ip9ZeAr9Ep
+9lPAl9Hj9ZeAZ9EY9lP@l9HT9Ze@Z9ET9Ue@k9DY9kP@U9Dj9UUT9UP@U9DT9UK@
+U9DT4UP@U4DT8UN@U9+T%UK@U4+T4UN5U%DT%UK'U3+S4UJ5U%DT%UJ#U4+S!UN#
+U!+S%UJ#))SJLL#+))US!UJ#U!+S!UJ!4!+S!4!#U!#)!UJ!L!)J!)J#)!#)!L!!
+J!)J!!J#!!!J!J!!)!)J!!!#)!!!!J!!!!!J!N!8"!J!J!*$r!!!!!3)!)+U3#!$
+r!2m!r`$rL*!)Gj!)r`!!!2m!N!6rrrm!rrrrJ*!)Ij!)r`#3#2q3"mb3#2rr!!$
+rr`!!riL)L2q)L)J!GhGh!(GhGrq!N!F!Ij!(L%3L%BK%)K&hZphZGl[GlK%L4)J
+4)N5)lYflGqlGZhH!3#!3#!3#!Aqrhqrhqrhq!3)%#"!J3)$qrI[hlpqrIq"`1"`
+1"i2"QFaQ-jR-CM1$"`iF1($J`60Qc*NcCXbCJ8)N'"JN3S&q[G[RjpZpIS*%+"!
+S4))"IE[AlpHlIIi!!!%!!!!&'!!!""J!!!"@!&&Rr"PB!!!!(!"@!!"3393M!!-
+!#J$krrm!N!95$f3""2rr!!!""J"5$e`"'2rr!!!#$!"5$h!"$[rr!!!$%J"5$fM
+L%3:
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/WordPerfectWorks_1.0.hqx b/writerperfect/qa/unit/data/draw/libmwaw/pass/WordPerfectWorks_1.0.hqx
new file mode 100644
index 000000000..a692cf555
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/WordPerfectWorks_1.0.hqx
@@ -0,0 +1,104 @@
+(This file must be converted with BinHex 4.0)
+:#@4bBAFa,RG`G`"#9f4b3PGVF`#3""3i!!!"BJAL3PGVFd*AC(*#9f4b!*!&!3#
+3"`%!N!B""`#3"!32!!N!!!!*!*!-!3#3"!F!!3!2!!!!5!")!*!%![!#32rarqi
+$#3*5B`)&+!2m!3!!!!&S!@J!N!31X!Y!!!%"!!"N!!%!!!!"!!)!!!!"*`m!!3#
+3$K!!N!N3!2qerkB2,3ZD!!J"!*!0'3%!!!%(!*!)!3F!N$J'4f9ZCACK!!!!"!!
+'!!!44!!!!(!!!!@S!!!2c!!'!!!4[!!!%``!!!!#!*!%!YS#+)!"!!%!#3!!!!N
+!!!!"!*!&#!!"!!!!!3!!!!)!!3!"!!!!!3#3"4N!'3!"!!`!N!8K!!$rr`#3#B!
+!J!#%!!B!J!!+!!!&+!#3&[q3#!!!)&#)N!3&!J#3""`L)L)F!!!!9D"!3&8+"!3
+!!+SUkJVk![i!!!#r!,qrX*!%!!#[AkpI$3X0#`!!GiQ2MhHBq2J!!-0Q2'E$CMa
+Q!!!)+K4M&#S)J!!!!%"FA&a!IJ!!!!JF2Rrhim'!!!!!%"$qI$KX4!!!!"`qIhp
+r2K`!!)"!)!!#"!J!!!!"!4!3!3%3%!!!%5*%!"%L4!!!!&99UUT99DUU!!#a-!-
+Ef-!-M3!!L%3L%4%L4)J!!)#!36i)#"6M!!#U!)!!L!#!!!!!%*!&+-BS!!!)(#,
+"J!%#"!!!#"3L3B!"!J3!!2q!J)$r#!J)!!$iG#*(MaFLF3!!UVqJ[kVl#[X!!2#
+3"!q3"!!!!!JF2Rmq(!J!!%#J!!!%#J#3"-`!!!!c!*!&4#)!L%3L!)J!!-`cc$2
+--m`c!!#!%!)J!3K!"!!!J8)N')&#*"J!!!1%5$!-!J%"!!#)&#*"L!#U!!!!JN3
+j4))"!3%!!"!J9+Vr!J3)!!#!`#%5$!3#!3!!!(prI`$hprF!!2"i*%+($a)K!!#
+rS,qp[Id&r3!!Q@CQQCPQCTN!!!!)&#T9+K3)!!#!!!!!#!#3"B!!#!#!!!J!!!#
+)!#)!L!!L!!!!UJ!4!+S!4!!!!)JLL#+))SJL!!#U4+S!UN5U!!!!UN5U%DT%UK%
+!!+T&UP5U4DT8!!#U9DT9UP@U93!!9ET9Ue@k9DX!!&@l9Hj9ZeAZ!!"9ZeAr9EY
+9r`!!GpehhAIGGpd!!&Arl[p9rl[r!!"hrphrGrrGr`!!Irrhrhrrprm!!)J!!!#
+)!*!&L!!J!)J!!J!!!+S!)J#U!#)!!!#U!+S!UJ#U!!!!UN#U!+S%UJ!!!+T!UK'
+U"+S4!!#U4+S9UN5U83!!UK@U9DT4UP8!!&AU9DT9VP@U!!"9ZeAU9EY9VJ!!9Ep
+9lPAl9Hi!!&@r9Ip9qeAr!!"9reAr9Ip9r`!!9IrGreArhIm!!(Irrrphrrrr!!"
+rrrrrprrrr`!!UT!)!!$-N!J!!)L3#!!!J*!)!!$r!!!!r`#3"Im!N!RrL)L)riL
+)L!!!ri#3"`!!%5*%L"%L4)J!!)K%)K')4#)4!!#$"`iF1($J`3!!i(!i(!i(Jm%
+!!!%#"!J3)%#!!!#!3#!3#!3#!3!!JN3S%#K%JJ%!!)&#*"JB*%+"!!!!r`$r!2m
+!r`!!rrm!!2rr!*!%Gj!)!!"rN!J!!!$rrrm!rrrr!!!!rj!(!!!!GhGh!(GhG`!
+!!(q3"`!!lYflGqlGZhF!!(HlhHjhZphZ!!!cCXbC-fE-Q3!!QFaQ-jR-CM-!!2l
+pqrI[hlpr!!"r[pr[pr[prJ!!IE[AlpHlIIi!!(kpfqIRfleq!*#JrhmJD!!))&!
+L!2pq!$K)3F,m!$MrI8*"d)%`-!JZ!!"1G8j@!!!JEJ%!!3!"!J!'!3!!#J!!#K3
+!!!!Hrj!'!!!!)3#3#8Amr22c"38!!!#*m[))#)5%!!!!cGhG#!J'"J!!!4%#!UZ
+VkZS!!!&9!!#!J"%4!!!"Q3#3"068!!!!(Yf3"J!!!"l-N!B!!!!HZj!'!!!!(UU
+3"J!!!"k)N!B!!!!KCT!'!!!!)853"J!!!#%LN!B!!!!K!*!*)8c-$K-!N!8K6-`
+F*`#3"5&-c#Sm!*!&)8c-1&!!N!8K6-a'C3#3"!&945"-c!#3"!&90`Y-c!#3"!&
+9+2K-c!#3"!&9'Z*-c!#3"!&9$-p-c!#3"!&9!!"-c!&)!!!"93!!6-`2@`!!!98
+!!%c-(A!!!!&9!!"-c#Z%!!!"93!!6-`jQ3!!!-f&(L0p!*!&cB8H''B!N!A0K4i
+`c!#3"Ff&(NNe!*!&cB8HBC`!N!A0K4jk"3#3"!&9Gp+&(J#3"!&9AfQ&(J#3"!&
+94`1&(J#3"!&9,TU&(J#3"!&9&M1&(J#3"!&9!!#&(J)i!!!"93!!K4iDRJ!!!98
+!!)8H-`F!!!&9!!#&(NYY!!!"93!!K4jMe`!!!-fpF$+"!*!&cEe`)VN!N!A0[A"
+&FJ#3"FfpF'J[!*!&4Ee`LZF!N!9&[A#YT3#3"8@UK,e`!*!&4BI([A!!N!3"9@8
+1[A!!N!3"98*4[A!!N!3"94qB[A!!N!3"93!![A!$+!!!!98!!,e`*H%!!!&9!!#
+pF%LH!!!"93!![A"V9`!!!4%!!,e`MK3!!!$0pF*"K3#3"Fhe`Ld,!*!&cIA#@KF
+!N!9&pF+(+!#3"8Ae`V3c!*!&4IA#i88!N!9&h6Ee`J#3"8@`*IA#!*!&4B-CpF)
+!N!3"99B)pF)!N!3"95MppF)!N!3"93!!pF)%'!!!!98!!2A#-53!!!&9!!$e`Pi
+e!!!"%3!!pF+,3!!!!4%!!2A#Z&)!!!$0rrpQ#bi8!!!!cIrr9)iZ&!!!!-hrrhX
+),K3!!!"&rrqKKbi8!!!!4Irrb!%Z&!!!!%Arrqjr,K3!!!"&k`Mrrbi8!!!!4F5
+*rrmZ&!!!!%@H$rrr,K3!!!&9Gj(rrbi8!!!"99%ArrmZ&!!!!98Z&2rr-C-!!!&
+9,K6rreJ0!!!"%5i8rrpqM!!!!4%Z&2rrT3B!!!%4,K6rrmZ&!!!!4IrrMePQCJ!
+!!%Arri+0CQB!!!"&rrqHY@CQ!!!!4IrrZYpQCJ!!!%ArrpF(CQB!!!"&rrrc-QC
+Q!!!!4I#SrrpQCJ!!!%A8IIrrCQB!!!"&Z&ErrfCQ!!!!4C`VrrpQCJ!!!%@!"2r
+rCQB!!!&9CQErrfMe!!!"%@CQrrq&(!!!!4&QC[rrS8F!!!%4CQErrle[!!!"%@C
+QrrrCQJ!!!"lrrlLRRVJ!!!!Hrrq`MCki!!!!([rr`Q'HZ!!!!"lrrp3iRVJ!!!!
+HrrrQ$Cki!!!!([rrpq5HZ!!!!"lf52rrRVJ!!!!Hj(,rrjki!!!!(Y+GrrqHZ!!
+!!"l!a[rrRVJ!!!!HV[(rrjki!!!!(TkirrqJ9`!!!"kHZ2rrXL`!!!!HRVMrrm3
+#!!!!(Tkirrr9e`!!!"kHZ2rrjki!!!!HrrrKpYF+!!!!([rrhScA#J!!!"lrrqB
+1e`S!!!!HrrrYNGF+!!!!([rrp42A#J!!!"lrrrb@e`S!!!!HqqRrrpF+!!!!([4
+QrrrA#J!!!"lXj2rre`S!!!!Hj@(rrpF+!!!!(YhIrrrA#J!!!"lA#[rrelN!!!!
+He`Vrrpml!!!!(YF+rrrQ[J!!!"lA#[rrlN!!!!!He`VrrrA$!!!!(YF+rj!%!!!
+!(YF+q(lrr`!!!"lA#[$mrrm!!!!He`VTHIrr!!!!(YF+iIIrr`!!!"lA#YTdrrm
+!!!!Hfb(A#[rr!!!!(Z+Ne`Vrr`!!!"lU*YF+rrm!!!!HmDRA#[rr!!!!([NVe`V
+rr`!!!"lrrpF+re%!!!!HrrrA#[I2!!!!([rre`V`6!!!!"lrrpF+k-S!!!!Hrrr
+A#Z&)!!!!(TkirrrrrJ!!!"kHZ1iVrrm!!!!HRVMF9rrr!!!!(TkibS$rr`!!!"k
+HZ,LVrrm!!!!HRVLQe2rr!!!!(UK`RVMrr`!!!"kk4Tkirrm!!!!Hc"ZHZ2rr!!!
+!(YhbRVMrr`!!!"l[ajkirrm!!!!HrrqHZ2jK!!!!([rrRVMXM!!!!"lrrjkifVB
+!!!!HrrqHZ-MK!!!!([rrRVLh#J!!!4&QC[rrrri!!!%4CQEMfIrr!!!"%@CQal(
+rr`!!!4&QCUZ(rrm!!!%4CQD2Arrr!!!"%@CQFc6rr`!!!4&e[QCQrrm!!!#*NHP
+QC[rr!!!!LDi3CQErr`!!!)R+1fCQrrm!!!#*jQ*QC[rr!!!!LIrrCQEpF3!!!)R
+rrfCQi8S!!!#*rrpQCX8I!!!!LIrrCQDSp`!!!)RrrfCQM-d!!!%4,K6rrrrp!!!
+"%5i8fBErr`!!!4%Z&,--rrm!!!%4,K5-MIrr!!!"%5i8CK2rr`!!!CNZ&$q9rrm
+!!!'C3``Z&2rr!!!"Q@Q,,K6rr`!!!)Q3!!8Z&2rr!!!!LED$,K6rr`!!!)RFr5i
+8rrm!!!#*rrmZ&2b"!!!!LIrr,K6@"`!!!)Rrrbi8ViJ!!!#*rrmZ&)N1!!!!LIr
+r,K4LM`!!!4%!!2A#pEi!!!%4!!$)YrA#!!!"%3!!Qk[e`J!!!4%!!'kDpF)!!!'
+C!!""MrA#!!!"Q3!!&(he`J!!!CNBM!!!pF)!!!'C4Cd!!2A#!!!"QA+T!!$e`J!
+!!)QIZJ!!pF)!!!#*c-8!!2A#!!!!LIA#!!$aUJ!!!)Re`J!!a*i!!!#*pF)!!*H
+0!!!!LIA#!!"UJJ!!!-he`J!!2A%!!!%4!!#pF,eY!!!"%3!!QVHpF!!!!4%!!(I
+q[A!!!!'C!!"93Ee`!!!"Q3!!-SQpF!!!!CN!!!r,[A!!!!'C%Z`!!,e`!!!"Q6@
+T!!#pF!!!!CPBBJ!![A!!!!#*Ham!!,e`!!!!LChB!!#pF!!!!)QpF!!!ZNJ!!!#
+*[A!!!*H2!!!!LEe`!!"ddJ!!!)QpF!!!8KN!!!$0[A!!!#pF!!!"%3!!K4k&(!!
+!!4%!!'biK4i!!!'C!!"88S8H!!!"Q3!!1qQ&(J!!!CN!!#1#K4i!!!'C!!!,'B8
+H!!!"Q3e-!!#&(J!!!CNPY3!!K4i!!!'C2KX!!)8H!!!"Q9D%!!#&(J!!!CPZk`!
+!K4i!!!#*K4i!!),Q!!!!cB8H!!"UJ!!!!-f&(J!!8KF!!!$0K4i!!$Qa!!!!cB8
+H!!!K52lrrr`J8#&,!!B!!"M)rqK1ANje!!)!!J!'!!B!!J!m!!!"D!#3#2rp!!!
+!$!!!!!3!N!X-!!!!"!!!!!`!N!F-!!$rr3#3$3%!N!6rmJ!!!!i!!!!1!!!!RB!
+!!#d!N!F#!*!Drre-c#Sm!!!!%dc-1&!!!!!86-a'C3!!!"9&)%c-!!!!&MF,6-`
+!!!!A+2K-c!!!!"JDiNc-!!!!'3c2rr`!!!!D!!"-c!&)!"X!!%c-$eX!(!!!6-`
+GF!!G!!"-c#Z%!"i!!%c-1CN!(i8H)hd!!!!JK4iBCJ!!rrZ&(M$-!!!!)S8H568
+!!!!MK4jKR!!!!#5&(RS&!!!!*AI5K4i!!!!QAfQ&(J!!!#G(!i8H!!!!+#kD!*!
+&+4BcK4i!!!!U!!#&(J)i!#X!!)8H'Ti!,!!!K4ic"`!Y!!#&(NYY!#i!!)8HBpF
+!,le`-S%!N!33!3!4J!!!8)!!!'1!!!&IJ!!!!4!(!$B!!!"e!!!!5J!!!4i!!!!
+#%!%!KS!!!$k!!!$KJ!!!f)!!!!-3!J#'J!!"$B!!!21!!!'$J!!!""!$!''!!!"
+U!!!!L)!!!*)!!!!&%!-!BB!!!5F!!!#)J!!"6`!!!!%!N!8)!!%!!!!"!!!!!J!
+"!%N!!!!h!%S!!!!C!"N!!!!-!*!)rrm!N!N(!*!&#!!"!!!!!3!!!!)!!!"*!!!
+!#3#3"4N!'3!!!!`!N!8K!!$rr`!!!!`!N!8"!*!&#!!"!!!!!3!!!!)!&`"*!!!
+!3J$C!!!!'3!C!!!!$!#3#2rr!*!*!J#3"3J!!3!!!!%!!!!#!$X!53!!!#3!C3!
+!!"N!'3!!!!`!N!Mrr`#3#3-!!!!"!!J!!`!!!!3!!!!#!!%!53!!!#3!N!8C!"N
+!N!crr`#3#3-!!!!4!!J!!`!!!!3!!!!#!!%!53!!!#3!N!8C!"N!!3#3#[rr!*!
+*!3!C!"!!83!!!"P")%*PB@GXC9G[FQYc*h-JC(*KGb"QD@aP#8`!!!%!!!!"(!!
+!!"`!!!"'UY$T!!J[##"Zrr`JD!#U)QJ!$%k4F!"36f!#F!"`!#m,+Q4bBAFa,RG
+`Gc!#!!!!3PGNFN*ADh-!N!T#9f4b3PGVF`#3'-qdeM3!N!B"BJ!!M+-H+%JJ$'F
+B,`a1Z[X)+%!TI!!!!0)!IKPm!!%!KPK2)!`SE[rm6Pj1G3!!%RB2m!!Q6PB!!%M
+R!"JQEJ!F+'i!##m,,bi!'$!Z!"C)`#m!-#i!%NM!,`![,J!-,`a1V3jU)%XLD`!
++d1N!Q#m))%NLD!#F6T%j3!!`61iB!2m!!!!-#d*PB@GXC9G[FQYc!!!!#!"1!!)
+"h!*f!!!"!!!!!4`!!!!F!!!!4J!YD,`AJJ!!!"`!4J!"8e45)!!!!"*h8'pc!!!
+!(Vrdrrm!N!8YBJ3$kIrr!!!!%!#3",il:
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/WordPerfectWorks_P_1.0.hqx b/writerperfect/qa/unit/data/draw/libmwaw/pass/WordPerfectWorks_P_1.0.hqx
new file mode 100644
index 000000000..413a8fdbf
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/WordPerfectWorks_P_1.0.hqx
@@ -0,0 +1,137 @@
+(This file must be converted with BinHex 4.0)
+:#R"KD@jd-5jhF(F!3PG`G%*ADh-!N!3BX3!!!@+H,%*ADh0#9h"d3PG`G!#3"3%
+!N!F"!*!'!3F!N!3%$!!*!!!!#3#3$!%!N!3(!!%!$`!!!%J!5!#3"!,`!N$rmIr
+Z!`N#8Q-#"5J$r!%!!!!"D!&S!*!%$V!,3!!"!3!!C!!"!!!!!3!#!!!!!5F2!!%
+!N!i3!*!*%!$rYIqQ$bd,QJ!)!3#3$4N"!!!""`#3#!%(!*!i"NGPEQ9fB3!!$i3
+!!!J)!Y!#3!!"!*!Ar`!!rj!'!!(mr22c"38!![,b#!L%K!!$hGd)#!B'!!3#!UZ
+VkZS!"3!!J)!4%3!'!*!%e03!"pf3"J!)c*!'!!QlN!B!#UU3"J!,L*!'!!aQN!B
+!$853"J!1)T!'!!m!N!F36-`1%`!!!"&-c"`R!!!!%Nc-+M`!!!!66-`i8!!!!"4
+-c%CP!!!!&88J6-`!!!!@0`Y-c!!!!"FSq%c-!!!!'"VL6-`!!!!C$-p-c!!!!"S
+!!%c-!8J!'`!!6-`2@`!F!!"-c"e`!"d!!%c-+i3!(J!!6-`jQ3!IK4iMI3!!!##
+&(KKQ!!!!)B8H--`!!!!LK4j*03!!!#1&(Q'F!!!!*)8HHJ8!!!!PGp+&(J!!!#C
+IDB8H!!!!*dF$K4i!!!!S,TU&(J!!!#N@-i8H!!!!+J!!K4i#1!!V!!#&(KUH!#`
+!!)8H-`F!,3!!K4j,E3!Z!!#&(Q2A!#qpF$+"!!!!-,e`)VN!!!!a[A"&FJ!!!$+
+pF'J[!!!!-le`LZF!!!!d[A#YT3!!!$@UK,e`!!!!0SI([A!!!!!hC3kpF!!!!$K
+#8Ee`!!!!14qB[A!!!!!k!!#pF!-S!$X!!,e`*H%!2!!![A")RJ!p!!#pF'YA!$i
+!!,e`MK3!2rA#3B8!!!"!pF)Y#`!!!%(e`PSA!!!!3[A#KbJ!!!"$pF+d-`!!!%6
+e`Z&&!!!!4GdfpF)!!!"'X#Ae`J!!!%H$'IA#!!!!5&B)pF)!!!"*+2he`J!!!%S
+!!2A#""J!5`!!pF)a*!"-!!$e`Pie!%d!!2A#Ld!!6J!!pF+i8J"2rrpQ#bi8!&$
+rre51,K3!8IrrH`JZ&!"5rrqKKbi8!&2rrmJ",K3!92rrlRmZ&!"9k`Mrrbi8!&E
+%LIrr,K3!9ji2rrmZ&!"BGj(rrbi8!&P4&rrr,K3!@Li8rrmaN`"E,K6rreJ0!&`
+Z&2rrIS`!A5i8rrqP"J"H,K6rrmZ&!&rrripCCQB!B2rrJSeQCJ"KrrqHY@CQ!',
+rrlVICQB!Brrre`GQCJ"Nrrrc-QCQ!'A`U2rrCQB!CY4prrpQCJ"RZ&ErrfCQ!'L
+F+rrrCQB!DB!%rrpQCJ"UCQErrfMe!'YQC[rrK4`!E'CQrrqK4`"YCQErrle[!'j
+QC[rrfCS!ErrrZ+HHZ!"`rrq`MCki!((rrm*KRVJ!F[rre$LHZ!"crrrQ$Cki!(6
+rrrINRVJ!GIC)rrqHZ!"fj(,rrjki!(I5RIrrRVJ!H-$'rrqHZ!"jV[(rrjki!(U
+HZ2rrS&F!Hjkirrqb,!"mRVMrrm3#!(fHZ2rreGF!ITkirrrRVJ"rrrrKpYF+!)$
+rrpk-e`S!JIrrjJlA#J##rrrYNGF+!)2rrr86e`S!K2rrr*EA#J#&qqRrrpF+!)E
+dC[rre`S!KqcNrrrA#J#)j@(rrpF+!)RGhrrre`S!LYF+rrrAZ3#,e`Vrrpml!)c
+A#[rrjVi!MGF+rrrZ3!#1e`VrrrA$!)rA#[q3"!#3!0F+q(lrr`#4e`V`r2rr!*,
+A#ZPjrrm!NpF+iIIrr`#8e`VDG2rr!*AE)GF+rrm!PZ+Ne`Vrr`#AkLEA#[rr!*M
+aUGF+rrm!QINVe`Vrr`#DrrrA#[p4!*[rrpF+pmm!R2rre`V`6!#GrrrA#ZM+!*l
+rrpF+i8J!RjkirrrrrJ#JRVMZ+rrr!+'HZ0aArrm!STkibS$rr`#MRVLiUrrr!+5
+HZ+E8rrm!TDK`RVMrr`#QZNDHZ2rr!+I-'jkirrm!U0hbRVMrr`#TlmHHZ2rr!+V
+rrjkirQ%!UrrrRVMXM!#XrrqHZ0Uf!+hrrjkib1%!V[rrRVLh#J#[CQErrrrq!,"
+QCZ2Crrm!X@CQal(rr`#bCQDVKrrr!,0QCSpIrrm!Y'CQFc6rr`#eGEjQC[rr!,D
+4k@CQrrm!Yki3CQErr`#ibMYQC[rr!,RQBQCQrrm!Z[rrCQEpF3#lrrpQCZ&+!,c
+rrfCQa4m![IrrCQDSp`#qrrpQCSc0!,mZ&2rrrrd!`#i8fBErr`$",K5c$2rr!-)
+Z&)b0rrm!`bi8CK2rr`$%,K3rPIrr!-9$$#i8rrm!aQQ,,K6rr`$(N!!&,K6rr`$
+)YS-Z&2rr!-RFr5i8rrm!b[rr,K6mJ3$,rrmZ&0B(!-crrbi8ViJ!cIrr,K5*$J$
+1rrmZ&'+2!-m!!2A#pEi!d!!!b,Ie`J$4!!#EUrA#!0)!!'kDpF)!d`!!3Bre`J$
+8!!!8IIA#!08BM!!!pF)!eN@G!!$e`J$AFUN!!2A#!0LIZJ!!pF)!fFc&!!$e`J$
+DpF)!!2'U!0[e`J!!a*i!h2A#!!#AM3$GpF)!!'U#!0le`J!!2A%!h`!![A#pE3$
+J!!#DYle`!1%!!(Iq[A!!iJ!!98'pF!$M!!!bLEe`!13!!!r,[A!!j4,X!!#pF!$
+Q0DN!!,e`!1GBBJ!![A!!k(XI!!#pF!$TRGJ!!,e`!1UpF!!!ZNJ!kle`!!#AM`$
+X[A!!!(65!1fpF!!!8KN!lVe`!!![A!$[!!#&(S8F!2!!!'biK4i!m3!!9&+&(J$
+b!!!lkB8H!2-!!#1#K4i!p!!!#aQ&(J$e$8`!!)8H!2BPY3!!K4i!pciE!!#&(J$
+i9S3!!)8H!2PZk`!!K4i!qS8H!!##jJ$lK4i!!'U!!2b&(J!!8KF!rB8H!!!jX3$
+qK4i!!#&)!2m!N!B2K!#3"!,3!N!!%3,r$!$rN!3!N!J#3!!!!Y!!N!HJ!))!!3!
++!*!%!Y!#3!#B!%J!N!3#d!*!!*!%!Y!#3!#3"!,3!N!!!!+j!!+j!!+j!!+j!!+
+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+
+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+
+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+j!!+
+j!"Rc!!X#!2J!!!B!3%!!3!(q!!3)!)!BM0X!&r-!#`)!K!!!!J"!3!"!!I`!!S!
+J"0X!'[-!&!8!K($KiKa%4aG%F"`(KaLa`('%10`!'[-!&!8!q)N5)L)NL*K)L#)
+%5)M)J##%40`!'[-!&!L!K)Mb)L)UL*!!8)!J"%H)L)!JK%6F!"Vc!"3)J)6j%L)
+q+SL3!'"`(!4)L)L!))4mh!!Dm`!8(m#%J4)L)"%)N!"3#!)%5)L)J##%30`!'[-
+!&""!K)N5)L)4#*!!5)JL"%L)L)!JK%6F!"Vc!"3332K`mH)F%3F34(!F"iH)L'!
+JK$MF!!VZ!!!JqJ!!"08!#qm!!3)JqJ!!"08!"qm!!3(!c3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!1q3!!$q[r!-$e!2k
+!k!!5q3!!$q[r!-$h!!!"r8%!31N!$[N!!!rVr`$!p`$l2ZN!$[N!!!rVr`$!q!$
+k#1N!$[N!!!rVr`$!q!$j#1S!%2N!!!rVr`$!q3!!"2N8kJ!5q3!!$q[r!-$j!!!
+MqH-!i1X!$[N!!!rVr`$!q3$hJ1X!$[N!!!rVr`$!q3$fJ1`!%[N!!!rVr`$!qJ!
+!!IG"!%$X!"$j!!!2krm!`2S!pMi!21`!$[N!!!rVr`$!qJ$e#1`!$[N!!!rVr`$
+!qJ$e#1`!%2N!!!rVr`$!q`!!"288l!!5q3!!$q[r!-$l!!!$pH-!i1d!$[N!!!r
+Vr`$!qJ$dJ1d!$[N!!!rVr`$!q`$cJ1d!%2N!!!rVr`$!r!!!!I0"l3!3q3!!$q[
+r!-$m!!!#mclY!!lj!!!2krm!`2X!m`MY!!lj!!!2krm!`2`!mJMY!"$j!!!2krm
+!`2`!mK3!%1i!%[N!!!rVr`$!r!!!)r2M!1$Z!!lj!!!2krm!`2X!mS$Z!!lj!!!
+2krm!`2X!mS$Z!"$j!!!2krm!`2`!mN%!31i!$[N!!!rVr`$!r!$a2Zi!$[N!!!r
+Vr`$!r!$a#1i!$[N!!!rVr`$!r!$a#1i!$[N!!!rVr`$!r!$a&1i!%[N!!!rVr`$
+!r3!!!r(M!)$[!!lj!!!2krm!`2`!m)$[!!lj!!!2krm!`2`!m)$[!",j!!!2krm
+!`2d!!!(a33"!l`!5q3!!$q[r!-$p!!!1m6i!)1m!$[N!!!rVr`$!r3$`#1i!$[N
+!!!rVr`$!r3$`#1i!%2N!!!rVr`$!r3!!"2%8lJ!5q3!!$q[r!-$p!!!$mH-!i1m
+!$[N!!!rVr`$!r!$`J1m!$[N!!!rVr`$!r!$`J1m!%[N!!!rVr`$!r3!!!I&"!%$
+[!",j!!!2krm!`2d!!!la2J!Jl`!1q3!!$q[r!-$p!2!)lJ!1q3!!$q[r!-$m!2%
+)lJ!3q3!!$q[r!-$p!!!%m46Z!",j!!!2krm!`2d!!!2ai`$!l`!1q3!!$q[r!-$
+m!2#!l`!1q3!!$q[r!-$m!2#!l`!3q3!!$q[r!-$p!!!"m8(Z!!lj!!!2krm!`2`
+!m6lZ!!lj!!!2krm!`2`!m3MZ!!lj!!!2krm!`2`!m3MZ!!lj!!!2krm!`2`!m46
+Z!",j!!!2krm!`2`!!#2ci`$JlJ!1q3!!$q[r!-$l!2+!lJ!1q3!!$q[r!-$l!2+
+!lJ!5q3!!$q[r!-$m!!!"md%!31i!%2N!!!rVr`$!r!!!"[-ql3!1q3!!$q[r!-$
+l!2-)l3!1q3!!$q[r!-$l!2-)l3!1q3!!$q[r!-$l!2-8l3!5q3!!$q[r!-$l!!!
+MpH-!i1d!$[N!!!rVr`$!qJ$dJ1d!$[N!!!rVr`$!qJ$dJ1d!%2N!!!rVr`$!q`!
+!!I9"l!!1q3!!$q[r!-$k!28ql!!1q3!!$q[r!-$k!28)l!!1q3!!$q[r!-$k!2B
+)k`!3q3!!$q[r!-$k!!!%pa6V!"$j!!!2krm!`2N!q1-!iZX!$[N!!!rVr`$!q!$
+iJ1X!$[N!!!rVr`$!q!$iJ1X!%2N!!!rVr`$!q!$k33"!kJ!5q3!!$q[r!-$i!!!
+1qci!)1S!$[N!!!rVr`$!p`$l#1N!$[N!!!rVr`$!pJ$p#1J!%2N!!!rVr`$!pJ!
+#""38j`!+q3!!$q[r!-$C!!Vj!!!2krm!`0N!#[N!!!rVr`$!f3!+q3!!$q[r!-$
+C!!Vj!!!2krm!`0N!#[N!!!rVr`$!f3!+q3!!$q[r!-$C!!Vj!!!2krm!`0N!#[N
+!!!rVr`$!f3!+q3!!$q[r!-$C!!Vj!!!2krm!`0N!#[N!!!rVr`$!f3!+q3!!$q[
+r!-$C!!+j!!+j!!EG!!!%hJ!(h3!"!q$I!!IF!!'!J1!!"p`!!B#!i!!+hJ!!!Ij
+"!%$K!!MH!!!'r6lK!!EH!2X)iJ!'hJ$l#1)!"Yi!qK6M!!VI!!!"qZ-!iZ3!"Yi
+!q)$P!!EH!2H!jJ!+h`!!!IG"!%$R!!MI!28q!$$S!!EI!23)k!!'h`$c#1N!#1!
+!!!6b&1S!#Z!!!!2bi`$Jk`!'h`$aJ1X!"Z!!m)$V!!MK!!!"m8(U!!VK!!!'mMi
+!21S!"Z%!m!MU!!EK!2%)k3!'i3$a&1N!#1)!!!2aiqN!"Z%!mB$T!!EK!2'!k3!
++iJ!!!I*"!%$T!!EL!2%qk!!'iJ$a#1J!"Z)!m3MS!!VM!!!%mK3!%1J!#Z-!!#2
+bi`$Jk!!'iJ$aJ1J!"Z-!m)$S!!VN!!!"mN%!31F!#Z3!!!lb2J!mj`!'j!$a#1B
+!"Z3!m3MQ!!EN!2%8jJ!)j3!!!r(MjJ!'j!$aJ1B!"Z3!mB$Q!!MP!2&"!%$Q!!E
+P!2%qj3!'j3$a#18!"ZB!m!MP!!MQ!2%8!"$P!!VQ!!"MmZ-!i18!"ZB!m)$P!!E
+Q!2#!j3!+j`!!!I*"!%$N!!VR!!!HmMi!213!"ZF!m3MM!!ER!2%)i`!'j`$a&1-
+!#ZJ!!!2bi`$Li`!'j`$aJ1-!"ZF!mB$M!!MS!2&"!%$M!!ES!2%qiJ!'k!$a#1)
+!"ZN!m!ML!!MT!2%8!"$L!!MT!2(M!1$L!!ET!2#!iJ!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!
+#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!#Z3!!!+!!J`$rAPX!!!%!!!!"(!!
+!!"`!!!"'!3!+@BqU!bPI!!C)H!-",b`!"NkY!F)[,!!'F!-[!#!-+R"KD@jd-5j
+hF(F`[`)!!!"#9h"d3PGVF`#3#%*AF(4#9fYc!*!Bcl6@8J#3"J&LA`!@@Bm`,J!
+55-![!+Jr)'`!"L"3)9m!'LKZrra1ANje6PB!!#m-+'i!##"X!!BJ8$&X!"B!)(!
+3X'`!&Qi1)'`!"L"3-A`!%!!HB!SJE!!')&"#D!!H-#`!&P0!CaK63'F898"R%&P
+!C`a43'FL"%!!%'FfB%`JE!!')&!aI!!"!*!%$!Y#C@&RE'9AEh*VF`!!!!J!6J!
+#!G`#GJ!!!3!!!!%F!!!!(!!!!%B!,@Lm&i)!!!!F!%B!!9088L!!!!!5Ge"[F`!
+!!"krp2rr!*!&,9qS!qRrr`!!!"!!N!5,K!:
diff --git a/writerperfect/qa/unit/data/draw/libpagemaker/fail/.gitignore b/writerperfect/qa/unit/data/draw/libpagemaker/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libpagemaker/fail/.gitignore
diff --git a/writerperfect/qa/unit/data/draw/libpagemaker/indeterminate/.gitignore b/writerperfect/qa/unit/data/draw/libpagemaker/indeterminate/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libpagemaker/indeterminate/.gitignore
diff --git a/writerperfect/qa/unit/data/draw/libpagemaker/pass/shapes.pmd b/writerperfect/qa/unit/data/draw/libpagemaker/pass/shapes.pmd
new file mode 100644
index 000000000..40e7df8b2
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libpagemaker/pass/shapes.pmd
Binary files differ
diff --git a/writerperfect/qa/unit/data/draw/libstaroffice/fail/.gitignore b/writerperfect/qa/unit/data/draw/libstaroffice/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libstaroffice/fail/.gitignore
diff --git a/writerperfect/qa/unit/data/draw/libstaroffice/indeterminate/.gitignore b/writerperfect/qa/unit/data/draw/libstaroffice/indeterminate/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libstaroffice/indeterminate/.gitignore
diff --git a/writerperfect/qa/unit/data/draw/libstaroffice/pass/Draw_3.1.sda b/writerperfect/qa/unit/data/draw/libstaroffice/pass/Draw_3.1.sda
new file mode 100644
index 000000000..bd03aa7c1
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libstaroffice/pass/Draw_3.1.sda
Binary files differ
diff --git a/writerperfect/qa/unit/data/draw/libvisio/fail/.gitignore b/writerperfect/qa/unit/data/draw/libvisio/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libvisio/fail/.gitignore
diff --git a/writerperfect/qa/unit/data/draw/libvisio/indeterminate/.gitignore b/writerperfect/qa/unit/data/draw/libvisio/indeterminate/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libvisio/indeterminate/.gitignore
diff --git a/writerperfect/qa/unit/data/draw/libvisio/pass/EDB-22679-1.vsd b/writerperfect/qa/unit/data/draw/libvisio/pass/EDB-22679-1.vsd
new file mode 100644
index 000000000..a0f5242a4
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libvisio/pass/EDB-22679-1.vsd
Binary files differ
diff --git a/writerperfect/qa/unit/data/draw/libvisio/pass/fdo57117-1.vsd b/writerperfect/qa/unit/data/draw/libvisio/pass/fdo57117-1.vsd
new file mode 100644
index 000000000..3d7387766
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libvisio/pass/fdo57117-1.vsd
Binary files differ
diff --git a/writerperfect/qa/unit/data/draw/libwpg/fail/.gitignore b/writerperfect/qa/unit/data/draw/libwpg/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libwpg/fail/.gitignore
diff --git a/writerperfect/qa/unit/data/draw/libwpg/indeterminate/.gitignore b/writerperfect/qa/unit/data/draw/libwpg/indeterminate/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libwpg/indeterminate/.gitignore
diff --git a/writerperfect/qa/unit/data/draw/libwpg/pass/WPG1.wpg b/writerperfect/qa/unit/data/draw/libwpg/pass/WPG1.wpg
new file mode 100644
index 000000000..273089649
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libwpg/pass/WPG1.wpg
Binary files differ
diff --git a/writerperfect/qa/unit/data/draw/libzmf/fail/.gitignore b/writerperfect/qa/unit/data/draw/libzmf/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libzmf/fail/.gitignore
diff --git a/writerperfect/qa/unit/data/draw/libzmf/indeterminate/.gitignore b/writerperfect/qa/unit/data/draw/libzmf/indeterminate/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libzmf/indeterminate/.gitignore
diff --git a/writerperfect/qa/unit/data/draw/libzmf/pass/ZonerDraw_5.zmf b/writerperfect/qa/unit/data/draw/libzmf/pass/ZonerDraw_5.zmf
new file mode 100644
index 000000000..fa2a96a6c
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libzmf/pass/ZonerDraw_5.zmf
Binary files differ
diff --git a/writerperfect/qa/unit/data/import/SOLVE.FM3 b/writerperfect/qa/unit/data/import/SOLVE.FM3
new file mode 100644
index 000000000..8e4a2ed2d
--- /dev/null
+++ b/writerperfect/qa/unit/data/import/SOLVE.FM3
Binary files differ
diff --git a/writerperfect/qa/unit/data/import/SOLVE.WK3 b/writerperfect/qa/unit/data/import/SOLVE.WK3
new file mode 100644
index 000000000..7b3d74c1d
--- /dev/null
+++ b/writerperfect/qa/unit/data/import/SOLVE.WK3
Binary files differ
diff --git a/writerperfect/qa/unit/data/impress/libetonyek/fail/.gitignore b/writerperfect/qa/unit/data/impress/libetonyek/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/impress/libetonyek/fail/.gitignore
diff --git a/writerperfect/qa/unit/data/impress/libetonyek/indeterminate/.gitignore b/writerperfect/qa/unit/data/impress/libetonyek/indeterminate/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/impress/libetonyek/indeterminate/.gitignore
diff --git a/writerperfect/qa/unit/data/impress/libetonyek/pass/Keynote_1.key b/writerperfect/qa/unit/data/impress/libetonyek/pass/Keynote_1.key
new file mode 100644
index 000000000..f59ccfab0
--- /dev/null
+++ b/writerperfect/qa/unit/data/impress/libetonyek/pass/Keynote_1.key
Binary files differ
diff --git a/writerperfect/qa/unit/data/impress/libetonyek/pass/Keynote_2.key b/writerperfect/qa/unit/data/impress/libetonyek/pass/Keynote_2.key
new file mode 100644
index 000000000..8d7cd4b72
--- /dev/null
+++ b/writerperfect/qa/unit/data/impress/libetonyek/pass/Keynote_2.key
Binary files differ
diff --git a/writerperfect/qa/unit/data/impress/libetonyek/pass/Keynote_3.key b/writerperfect/qa/unit/data/impress/libetonyek/pass/Keynote_3.key
new file mode 100644
index 000000000..5d715e68c
--- /dev/null
+++ b/writerperfect/qa/unit/data/impress/libetonyek/pass/Keynote_3.key
Binary files differ
diff --git a/writerperfect/qa/unit/data/impress/libetonyek/pass/Keynote_4.key b/writerperfect/qa/unit/data/impress/libetonyek/pass/Keynote_4.key
new file mode 100644
index 000000000..bf3c9f0c5
--- /dev/null
+++ b/writerperfect/qa/unit/data/impress/libetonyek/pass/Keynote_4.key
Binary files differ
diff --git a/writerperfect/qa/unit/data/impress/libetonyek/pass/Keynote_5.key b/writerperfect/qa/unit/data/impress/libetonyek/pass/Keynote_5.key
new file mode 100644
index 000000000..fe2f9ad21
--- /dev/null
+++ b/writerperfect/qa/unit/data/impress/libetonyek/pass/Keynote_5.key
Binary files differ
diff --git a/writerperfect/qa/unit/data/impress/libetonyek/pass/Keynote_6.key b/writerperfect/qa/unit/data/impress/libetonyek/pass/Keynote_6.key
new file mode 100644
index 000000000..b0401b398
--- /dev/null
+++ b/writerperfect/qa/unit/data/impress/libetonyek/pass/Keynote_6.key
Binary files differ
diff --git a/writerperfect/qa/unit/data/impress/libmwaw/fail/.gitignore b/writerperfect/qa/unit/data/impress/libmwaw/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/impress/libmwaw/fail/.gitignore
diff --git a/writerperfect/qa/unit/data/impress/libmwaw/indeterminate/.gitignore b/writerperfect/qa/unit/data/impress/libmwaw/indeterminate/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/impress/libmwaw/indeterminate/.gitignore
diff --git a/writerperfect/qa/unit/data/impress/libmwaw/pass/ClarisWorks_6.0.cwk b/writerperfect/qa/unit/data/impress/libmwaw/pass/ClarisWorks_6.0.cwk
new file mode 100644
index 000000000..2e60a81d3
--- /dev/null
+++ b/writerperfect/qa/unit/data/impress/libmwaw/pass/ClarisWorks_6.0.cwk
Binary files differ
diff --git a/writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_2.ppt b/writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_2.ppt
new file mode 100644
index 000000000..4856f15f5
--- /dev/null
+++ b/writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_2.ppt
Binary files differ
diff --git a/writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_3.ppt b/writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_3.ppt
new file mode 100644
index 000000000..f2185ab92
--- /dev/null
+++ b/writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_3.ppt
Binary files differ
diff --git a/writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_4.ppt b/writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_4.ppt
new file mode 100644
index 000000000..bd2a464f9
--- /dev/null
+++ b/writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_4.ppt
Binary files differ
diff --git a/writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_7.ppt b/writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_7.ppt
new file mode 100644
index 000000000..0556e51c6
--- /dev/null
+++ b/writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_7.ppt
Binary files differ
diff --git a/writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_Mac_1 b/writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_Mac_1
new file mode 100644
index 000000000..72be750b8
--- /dev/null
+++ b/writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_Mac_1
@@ -0,0 +1,48 @@
+(This file must be converted with BinHex 4.0)
+:#R"[Gf9bF'pTER3!8da%8e"36P3"!!!!#DB!N!6iJ!ZYhZd!!!!#!!!!'!!D!!3
+!!!QQ!!S!'3!!!+J!!!$S!!!!rJ!!!C!!!!!!(!!!!Si!N!B#UJ!!!$S!!!+U!!!
+"L!!!!Z3!!!"5!!!%E!!!!"`!!!5q!*!'"0S!!!!k!!!%fJ!!!"`!!!88!!!!'!!
+!"6!!!!!i!!!&5!!!!"3!!!@!!!!!1J!!"C3!!!!a!!!&cJ!!!$%!!!Ar!!!!'!!
+!"M!!!!&+!!!'5!!!!"J!!!H5!!!!&J!!"kS!!!"`!!!(`!!!!#!!!!J`!!!!1J!
+!#&!!!!"i!!!)LJ!!!+!!!!N#rf6reIq#!#S$!*!%!3-"!*Mrr`!"!"N!E&E-rk$
+r4J!'!!B#!*!%!3%"!"6rr`!"!!8!E&GS!#ArC!!mrjF$!*!%!3%"!!$rr`!!!")
+!E&GF!%MrA3"Yrj3$!!%!!!%%"3!!rrm!!!!5!'aAB!"irhB!VIrF!J#3"!%"!3!
+!rrm!!`!#!'a@D!!Brli!J!%8!J!"!3!"!3-!!2rr!!)!!J"X8f3"!!!(FfaTC'8
+J-J%!"J!!'!%!&3!!!!4KBATK!!B!!")"!"8!!!!&BQ&kHQ80!!B!!")"!"8!!!!
+%C'9PC!!'!!!5!3!9!!!!#`N*B3PKB@%*Bf&K$3!'!!!5!3!9!*!&"J!!%J%!&3!
+!!!4KN!3!"J!!%J%!&3!!!!0MBf2J!!B!!")"!"8$!!!(E'PREQ8J-3!!"J!!%J%
+!&3!!!!GXD@GZC5!b!3!'!!!5!3!9!3!!*f*TCb"kEfjP)''3'5"KN!6U!!B!!")
+"!"8#!3!-#C!%B@%*#@'3"!!'!!!5!3!9rjMqZ3"Trp!"!*!&!3%!r`#3#[q3"!#
+3"!%"!*!,!3#3"`B"!!!"9K3!'J!!!!-!N!8#!!'3"$3!m!%drf6re2q#!#`$!*!
+%!3%"!*Mrr`!"!"N!E&EBrjVrL2qJ!&S!N!B"!3!!rrm!!3#3"[qqrdErk2pm!3%
+"!!!!!J&"!2rr!!)!N!Erl[qX!",reJ'3"!!!#J-3!2rr!!%!N!FHrd!!92q#!3!
+"!!%!"`%!!2rr!*!*0[qf!'8!BJ-!!3!!!3%%!!$rr`!!!#B!E&CJ!)6r8J#HrpB
+#!*!%!3%"!!$rr`!!!!%!E&C)rm6rd2qQ!!`!N!B"!3%!rrm!!3#3"[r@rqJ!!!!
+f!*!'!3%#!2rr!!%!N!F'!"J!*2rd!*!'!3%!'2rr!!%!N!Ff!%J!(J!H!*!'!3%
+!!2rr!!%!N!EqL2lM!9N"*!%!N!8"!3$r!!)!N!MqP2l[!@8"-!%!N!8"!3$r!!)
+!N!MrcIr+!"-!23%!N!8"!3"X!!-!N!J"!!!(8faTC'8J-3`!"J!!'!%!&3!!!"T
+cE@&XE#"dCAKd$@)VG@jNCA*XD@jP+fpeG!!-!!!5!3!9!!X5$3!9!!!!"A4PH(3
+b!!!'!!!5!3!9rjMqZ3"Trp!"!*!&!3%!r`#3$33!N!8"!*!&E&0m!!!!"J#3"38
+!$J%!'2"1AL"I!!!!#!#3"3F!!3%"!!K3393Jrf6rYIq#!%S$!*!%!3%"!*Mrr`!
+"!"N!E&G`!3!!$%eKFh4PFL"cE'PNC3!'!!!B!3!9rjMqZ3"Trp!"!*!&!3%!r`#
+3#[qD!!!!'!#k!3!"!!!!!3%!&[rr!!%!%J"X9QJ"!!!)G'KP)'j[G'8!"J!!%J%
+!&3!!!!N!N!8"!*!,#`#3"3S!!3%!,blr[UKG!!!!$3#3"3`!!J%!U&d3(m!I!$%
+!N!3#d!*!%3'J!))"!!S!N!3#d!*!#J#3#$3!5!!Y!)J!QMLJ!)2r!$%!"`!(!%`
+!H4%"S!##!3!+!!F!"`"-!(N+!*!)0!!+!!S!5J"h1+!!Jrm!"rq3"!#3"`)!!!!
+2!!%!!!!3)!#3'K)!!!S2!6J!0J!N#Jm"!!"D!%J+$`&(!(i!E!S2!@i!SJ#3!!S
+2!@F!!3!$!&%!G`#A!*!2"J!5!!!+#`%i!$B!*!S,!3!!@J")#JX"4`"q!'`+#`&
+Z!+)!N!!+#`&R!!%!#J!)!"-!(!!N!$!!3!"3!&i!E!"f!$J!"!!-$"!"1!!f!#3
+-%!%!!&S!5!`3!8F!IJ"X$"!"EJ#L!*!!$"!"C`!"!!S!"`!0!"8!(3!M!#S!,J!
+k!%8!8!29!")!!!S2!6J!0J!N#Jm"!!"D!%J+$`&(!(i!E!S2!@i!SJ#3!!S2!@F
+!!!!+!!J!%`!F!#3!-!"!!&!!AJ"X!(B!1!!9!!`-%!%i!$B!*!`3!3!!@J")$"!
+"4`"q!'`-%!&Z!+)!N!!-%!&R!"8!%J(!!"8!%J(!!"8!'!&""q%!I4NJ!!%!!!!
+"!!%!EJ!!!3#3"#i!N!6qiIk*!5!"H!%!N!8"!3!-!*!+relr#J#Z!3J"!!%!!!!
+"!8%!rrm!!3#3"[pHraB!VJ#k!*!'!3%!!2rr!!%!N!Er22mkre2rp3-!N!3"!3%
+!!2rr!!!!%J"X9a!!!!!8G'9iG#"TEL"SB@jNEh9d)("KCf8!"J!!%J%!&5"Z!!j
+$l[ri!*!+rrJL6#,B)YJ`,J!-8d$T30"81)!!!!!@!*!&&3!%!3"63%M!JI`!$`!
+!!%J!5!#3"!,`!N$rmIrZ!`N#8Q-!"5J$r!%!!!!"D!&S!*!%$V!,3!!"!3!!C!!
+"!!!!!3!#!!!!!5F2!!%!N!i3!*!*%!$rYIqQ$bd,QJ!)!3#3$4N"rrrr,IrrrX!
+@aJ!!!#N!"3(F!R`!!J!#!*!&E&TB!!!!$J"X@1!!E&Pirbrqk3$5!4MqiIk*!5!
+"H!!!!"F!E&D!rr!!"!!"!!8!!!!#!*!&2J"6!&F!3J!'!!N!#J)"!!!!E&CB!'a
+9!!%#!!!!%3!!!")!!!!6rj!%!*!(&!)r!Zm"S`)Z!!%!J!!!!"J!N!J,VGlY$PB
+!!!:
diff --git a/writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_Mac_2 b/writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_Mac_2
new file mode 100644
index 000000000..6f646c1a5
--- /dev/null
+++ b/writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_Mac_2
Binary files differ
diff --git a/writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_Mac_3 b/writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_Mac_3
new file mode 100644
index 000000000..95b415b06
--- /dev/null
+++ b/writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_Mac_3
@@ -0,0 +1,101 @@
+(This file must be converted with BinHex 4.0)
+:"A"bCA-c!&0-4$038&3c!3!!!",*!!!%%fUe#khHl3!!!!-!!!!H!$`!#J!!%XN
+!8!!l!*!'J!!!'!!!!Ik!!!"!!!!#&S!!N!8#9S!!N!8#9S!!!,)!!!*@J!!!*J!
+!!`L!!!"!!!!$,S!!N!8$ES!!N!8$ES!!!'!!!!0ZJ!!!*J!!!mk!!!!J!!!$p)!
+!!#!!!!38J!!!&J!!"$5!!!!B!!!%5S!!!%!!!!4LJ!#3"35LJ!#3"35LJ!!"iJ!
+!"++!!!!Q!!!'K)!!!'!!!!DUJ!!!&!!!"`U!!*!&"ak!!!'q!!!((S!!!#B!!!M
+FJ!!!)!!!#3+!!!!B!!!*)S!!!#!!!!NkJ!!!&!!!#9U!!*!&#@k!!!#8!!!*ES!
+!!#B!!!S#J!!!)!!!#LL!!!!B!!!+5)!!!#!!!!TJJ!!!&!!!#S#!!*!&#T5!!!#
+8!!!+P)!!!#B!!!XSJ!!!)!!!#dk!!!!5!!!,ES!!!"!!!!Z!J!!!'J!!#j!!J!!
+!'J!!#kU!!!!D!!!,a)!!!$B!!![HJ!!!5!!!$"5!!!"!!!!-A)!!!&i!!!bFJ!!
+!'!!!$2U!!!35!!!0%S!!!#)!!"%NJ!!!"J!!%8D!!!!-!!!46)!!!!F!!"&BJ!!
+!$!!!%9q!!!!H!!!4Di!!!(J!!"'*J!!!0J!!%J'!!!#1!!!50`!!98i!!J!#rj!
+%!!!(!J!-!*!'%!##d2N3pc$li!M3!3!"N!3!!J#3"2rp!!![0`i8%!##`2a`pc!
+'N!!)d!%!!C!%!!)!N!6rr3!!)Pm#[!!!!!i!!!"J!*!&$J!!63#!!!!!q5hhD[[
+$#*B!!!!N!!%!!`!!,cF!rk8!N!4N!*!(!3"D!*!&!3!"!*!&$!#3"4!!N!8B!*!
+&(!#3"34-!)!!!!$mMIGU"R-)PJ!!!"J!!3!"!*!%3!'P!*!%C!#3#9S!(J!!!!%
+!!3#3"3`!N!83!*!&'!#3"4`!N!F%!!!!!3!#!!)!!3!!!!(r!*!1!J!!!!-3!),
+!rh$jd!Q3!!B`!3!"N!3!!J#3"2rp!!"$E`Vd%"!!`2C`qQ$qi!@J!3!"N!3!!J#
+3"2rp!!!"!*!+$Rrr!!!!$J!!6!#!!!!!rihk#JPc"IB!!!!-!!!!!3#3"IqP!*!
+%C!#3#9S!+!!!!!%!!3#3"3`!N!83!*!&'!#3"4`!N!F*!!!!"J!#!!)!!3!"!!$
+r!*!1"`!!!!J!@($%!*!("3!!!!S!@CH%!*!'!3#3"J%!!!!+!!%!N!N$!*!%J3#
+3#!Xm$!#3"``!!3!"!!!"!3"BF'3!!&91!!)!!J#3"JF#!!`!N!B3!),3q4$h-2[
+J#0!"!!'3"!!#!*!%rrd!!#*I$@33!),!r($h-!D3!!M3!3!"N!3!!J#3"2rp!!!
+LA`fN!!!!$J!!!*J!N!81!!"0!)!!!!$j,IGUqm-)P[rr!#3!!Irr!!!Ii!$rP3$
+rr`"N!*!(!3"D!*!&!3!"!!!!#e0XD@4P)&4TG'aP!J!-!!!!#`!3!!!!!3!!!!X
+!!!!N!!%!!`#3"4J!!!!,!"`!!!!"!!!!#`$rT3#3"'3!N!F"!&S!N!8"!!4-!)!
+!!!$mMIGU"R-)P[rr!!i!!Irr!!!Ii%$rPJ$rr`"N!*!&"!!!!&S!(J#3"3%!!!!
+l3QpNH5"8CAKd$90PBfpZC#"-CACPE!e8D'PbC#"-CACPE!e'Eh9bG'JJ6'9fC@`
+04QPQG'JJ6'9fC@cS!!`!!!!l!"!!!!!$!!!!#J!!!"J!!3!"!*!('3!!!")!!3!
+"!*!('!!!!!i!!3!"!*!&'!!!!$X!(!!!!!8!!!!+3!'P!*!%C!#3#9S!(J!!!!%
+!!!!03!(3!*!%C!#3"3%!!!"D!"i!N!F-3!()!*!%C!#3"3)!!!"D!"i!N!F03!'
+P!*!%C!#3"3-!!!"D!"i!N!F,3!(3!*!%C!#3"33!!!"D!"i!N!F5!!!!$`!#!!)
+!!3!!!!(r!*!1%!!!!"%3!+6!#Lrr&JV2!1S"!!'3"!!#T!K[3rrp!!"$E`KF%"!
+!d2C`qQ$qi!@J!3!!!3!"!!)!N!6rr3#3"K!!JX$rF2R3#C!!"M!"!!!"!!%!!J#
+3"2rp!!"$E`HF)!!!'NB2!!!!$3!K!"`!0`!B!*!*P!#3"C3!"B`!J!!!!!T,rdd
++X`#crrm!#`!!rrm!!#4A!2q9!2rr!'3!N!F"!'3!-J#3"3%!!!!(8'&RC5!M)`!
+!$!!!!!F!%!!!!!%!!!!(!!!!$!!!!!%!N!8B!!!!"`!F!!!!!3!!!!F!rk8!N!4
+N!*!(!3"D!*!)6!#!!!!!rihk#JPc"IErr`!-!!$rr`#3"Iq9!2rr!'3!N!8%!!!
+!@J!S!!!!!3!"!!!!1d*[C(NJ9'9iG!e6C@0[EQ3J6'9fC@`09'KTFQ3J6'9fC@`
+04QpeFR4S)%aPGQ9X$8CTCR4S)%aPGQ9X!!!-!!!!1`!3!!!!!3!!!$X!!!!-!!!
+!!3#3"4J!!!!l!"`!!!!&!!!!#J$rT3#3"'3!N!PD!#J!!!!"!!!!$3$rT3#3"'3
+!N!8"!!!!@J!S!!!!!3!!!!`!rk8!N!4N!*!&!J!!!&S!+!!!!!%!!!!0!2qP!*!
+%C!#3"3-!!!"D!#J!!!!"!!!!#`$rT3#3"'3!N!8%!!!!@J!S!!!!!3!!!"F!!!!
+8!!-!!`!"!!%!!X-!N!i9!!!!&J"BEiJ!!!!1!!!!%`!!!"J!@9p-!&Q@U!!!!!%
+!N!C96J!#!!)!N!B(!J!-!*!'%!#N`!S[raB+c`$U!3!"N!3!!U3%TcErr3!!0UF
+%R#!!!"T'$`!!!!d!)3!F!$F!'!#3#R*N!!!!P!!&M!#!!!!!#N[r63Uc!,2rr`!
+-!!$rr`!!'8X!rj8!rrm!C!#3"`%!@J#3"`%!!!!(8'&RC5!M)`!!$!!!!!F!%!!
+!!!%!!!!(!!!!$!!!!!%!N!8B!!!!"`!F!!!!!3!!!!F!rk8!N!4N!*!(!3"D!*!
+*(J!!!"X!!3!"!!(rN!8!N!iF!!!!(3"BFh3!!!!D!*!((`#3#`%!N!C96J!#!!)
+!N!B(!J!-!*!'%!#N`!S[raB+c`$U!3!"N!3!!X`%TcErr3!!*SF$I#!!!"T'$`!
+!!!d!)3!F!$F!'!#3#K!"!!!!P!!&M!#!!!!!#N[r63Uc!,2rr`!-!!$rr`!!b)B
+!rj8!rrm!C!#3"`%!@J#3"`%!!!!(8'&RC5!M)`!!$!!!!!F!%!!!!!%!!!!(!!!
+!$!!!!!%!N!8B!!!!"`!F!!!!!3!!!!F!rk8!N!4N!*!(!3"D!*!**3!!!#)!!3!
+"!!(rN!8!N!iM!!!!*!"BEX`!!!!K!*!(*J#3#LSp!*!%J!%!F82D!!"rr`!!!!3
+!@0ld!!!!+!"aEeB!@@&-!&KZh!#3"!%J!5!#3!*!!f!$B!5!")!!!`*!!!!!Y!!
+!!E!")!,3!N!$c!0J"1`%J!!$!N!!N!B"%J%5!L-#)`-e!c8%4J4'!!-#)`!!J!%
+!F8`%!!Crr`!!!!3!@9pB!!F!!!!U!*!6!`!!!#X!!`!!!#`!!!QJJ!!!"`!U!#S
+!N!3#@!#3"CJ!N$%)!!S!!!!Zm(i!!2"m!!$`I`!!q2m!!2rm!!$rrJ!!rrd!!2r
+m!*!*!3!"!!%!!3!"!!%!!3!"!!$rr3#3"f3!C!"N!3%"!!iF0a8!!!QMJ!!!"`"
+Brj!'!&N!N!F%N@L4D*&S!&N!N!G%B8H2@rhb!$-!!+i8!!!!$rcX!3BSpJ!&cYM
+1f-lBJ!%!F8jS!!&rr`!!!!3!@9p-!!B!!!!`!&K`*!"BC4`!@'rX!!"0!)!I!!!
+!*!!"!!-!N!FN!!%!!`#3"b3!!3!$!*!(*!!"!!-!N!FN!!%!!`#3"IqP!*!%C!#
+3"`%!@J#3"3%!N!ArT3#3"'3!N!8"!!%!@J#3"3%!N!ArT3#3"'3!N!8#!!%!@J#
+3"3%!N!ArT3#3"'3!N!8$!!%!@J#3"3%!N!ArT3#3"'3!N!8%!!%!@J#3"3%!N!8
+%6!#!(`!!!"J!!3!"!*!(%J!"!!%!N!F5!!%!!3#3"`i!!3!"!*!($J!"!!%!N!4
+!!D8!N!4N!*!*@J!H!!!!!3#3"%!"d!#3"'3!N!8"!!!!@J!H!*!)3!()!*!%C!#
+3"3)!!!"D!"i!N!K!!D8!N!4N!*!&!`!!!&S!(J#3#%!"d!#3"'3!N!8%!!!!@J!
+H!*!+6!#!(`!!!!`!!!!"!*!($!!!!!%!N!F-!!!!!3#3"``!!!!"!*!($!!!!!%
+!N!ArT3#3"'3!N!PD!#J!!!!"!*!&rk8!N!4N!*!&!3!!!&S!+!!!!!%!N!ArT3#
+3"'3!N!8#!!!!@J!S!!!!!3#3"IqP!*!%C!#3"3-!!!"D!#J!!!!"!*!&rk8!N!4
+N!*!&"!!!!&S!+!!!!!%!N!6rrd`!J"m!!3!B!!!!!3#3"3%!'!!!!!%!N!8"!"J
+!!!!"!*!&!3!B!!!!!3#3"3%!'!!!!!%!N!48!D8!N!4N!*!*C!!8!*!)9!'P!*!
+%C!#3"3%!!!"N!"3!N!K8!D8!N!4N!*!&!J!!!'3!&!#3#&3"T3#3"'3!N!8$!!!
+!C!!8!*!)9!'P!*!%C!#3"33!!!"N!"3!N!V-!)!I!!!!%J!"!!%!N!F5!!%!!3#
+3"a)!!3!"!*!(%J!"!!%!N!F5!!%!!3#3"IqP!*!%C!#3#@3!N![rT3#3"'3!N!P
+N!*!,rk8!N!4N!*!*C!#3#rqP!*!%C!#3#@3!N![rT3#3"'3!N!PN!*!,!3!"!*!
+(!3!!!3!#!#!!!$!!-!#3")!!N!8&3A*TB@`!!!!d!*!%rrm!!!C(C@jPGQ%!!!!
+f!*!%rrm!1)!"!(&,f!!#Irm!!!!%!&PIE!!i!!!!03!&!!!!0`!$!!!!5!")!*!
+%!YS#+2rKrq)#q3*'!dF&+!2m!!)!!!")!%J!N!3#fJ)S!!%!!!"N!!!!!3!"!3%
+!!!!"*`m!!3!"!*!0!J!C!C!!!*!&3!#3#3%!N"%6!*!d!8J"Z!hJ%MMhN!$d`!K
+`#d$d`2H3!!Y!#(!!N!Jj9!!!!!d!!!!R!!!!'3!!!#!!!!!kqC!!piJ!!Irr!!%
+!!J!#!!-!N!FT!!!!,3!!!$%!!!![!!!!-`!!!$)!!!!i!*!%&S!3i"$J&S!!!3#
+3"6RrN!3!!#F3!!!G62rq!!!!F3!$#khHlA@*!!!"!!!!!md!!!,0!!!!4L"(4#"
+"8&"-!3#3&`9`FQ9c-`)!!!"66%3c8&"8-`%!rj!%!*!%#j`!N!466%3c8&"8-`%
+!rj!%!*!5e#plA`!!%XN!!!36!*!-!TiP!8j238e"8&"-!3#3(3&1*3&6594P8dP
+86!8!N"d"db8"BA4MEdGkDA$r!*!A!K)#%J#3"9X!H!!4![m-!2q3"!#3#AJ!!!"
+E!*!(!3!+!*!&@`"i!*L!22r6rm3!,J!m!*!*5!!!!%J!N!8%!!%!"!#3"9KbZ!#
+3"JDH!!!!$`!!rj!'!!%!N!6rr`!#!!#YD`!!!!-!!2rr!!!!"!!!rj!%!!9M')a
+Mrrm!"T5PP+@8T3!(cR21Fmjc!!Mrr`#3"3Rrr`!!+8S!#[rr!!$rr`!,rj!%!!!
+!$)3KK#'%)3!0cR21Fmjc!!jcR(1FFj`!$`#3"[r6rm3!,J!m!*!&@`"i!!!#a3!
+#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!
+#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!
+#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!
+#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!
+#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!
+#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!#a3!!!2m!!!#cXP4SDA-JC'pMG@e
+PER3JBfpeE'3JEQpd)'*P)'p`C@jPC#`JBQ9MBA9cC5"dD'8JBA"`E'PMBA4TEfi
+JdP"[Gf9b8'pTER3J-bi`db"MEh9XC#"ZEh3JBQ8JCQpeEQ3Z)#"8D'Pc)'4[Bh9
+YC@jd)'0KEL"KE(0[)'*P)'p`C@jPC#"QFQpY)(GTG'KTEL"dD'8JdP"[Gf9b8'p
+TER3J9QPPGf9bdb"KF("XD@0KG'P[ELi!!!%!!!!$c3!!!Xd!!!"'!&**`"6`!!!
+!(!"'!!&35808!!!!%P088L!!!!!H4Errr`#3"9KXE,rcrrm!!!)@!&KbQ*qr:
diff --git a/writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_Mac_4.ppt b/writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_Mac_4.ppt
new file mode 100644
index 000000000..7714520d8
--- /dev/null
+++ b/writerperfect/qa/unit/data/impress/libmwaw/pass/PowerPoint_Mac_4.ppt
Binary files differ
diff --git a/writerperfect/qa/unit/data/stream/fdo40686-1.doc b/writerperfect/qa/unit/data/stream/fdo40686-1.doc
new file mode 100644
index 000000000..bb0fd5927
--- /dev/null
+++ b/writerperfect/qa/unit/data/stream/fdo40686-1.doc
Binary files differ
diff --git a/writerperfect/qa/unit/data/stream/test.dir/META-INF/manifest.xml b/writerperfect/qa/unit/data/stream/test.dir/META-INF/manifest.xml
new file mode 100644
index 000000000..8b1378917
--- /dev/null
+++ b/writerperfect/qa/unit/data/stream/test.dir/META-INF/manifest.xml
@@ -0,0 +1 @@
+
diff --git a/writerperfect/qa/unit/data/stream/test.dir/Thumbnails/thumbnail.png b/writerperfect/qa/unit/data/stream/test.dir/Thumbnails/thumbnail.png
new file mode 100644
index 000000000..8b1378917
--- /dev/null
+++ b/writerperfect/qa/unit/data/stream/test.dir/Thumbnails/thumbnail.png
@@ -0,0 +1 @@
+
diff --git a/writerperfect/qa/unit/data/stream/test.dir/content.xml b/writerperfect/qa/unit/data/stream/test.dir/content.xml
new file mode 100644
index 000000000..8b1378917
--- /dev/null
+++ b/writerperfect/qa/unit/data/stream/test.dir/content.xml
@@ -0,0 +1 @@
+
diff --git a/writerperfect/qa/unit/data/stream/test.dir/manifest.rdf b/writerperfect/qa/unit/data/stream/test.dir/manifest.rdf
new file mode 100644
index 000000000..8b1378917
--- /dev/null
+++ b/writerperfect/qa/unit/data/stream/test.dir/manifest.rdf
@@ -0,0 +1 @@
+
diff --git a/writerperfect/qa/unit/data/stream/test.dir/meta.xml b/writerperfect/qa/unit/data/stream/test.dir/meta.xml
new file mode 100644
index 000000000..8b1378917
--- /dev/null
+++ b/writerperfect/qa/unit/data/stream/test.dir/meta.xml
@@ -0,0 +1 @@
+
diff --git a/writerperfect/qa/unit/data/stream/test.dir/mimetype b/writerperfect/qa/unit/data/stream/test.dir/mimetype
new file mode 100644
index 000000000..2e95b81c9
--- /dev/null
+++ b/writerperfect/qa/unit/data/stream/test.dir/mimetype
@@ -0,0 +1 @@
+application/vnd.oasis.opendocument.text \ No newline at end of file
diff --git a/writerperfect/qa/unit/data/stream/test.dir/settings.xml b/writerperfect/qa/unit/data/stream/test.dir/settings.xml
new file mode 100644
index 000000000..8b1378917
--- /dev/null
+++ b/writerperfect/qa/unit/data/stream/test.dir/settings.xml
@@ -0,0 +1 @@
+
diff --git a/writerperfect/qa/unit/data/stream/test.dir/styles.xml b/writerperfect/qa/unit/data/stream/test.dir/styles.xml
new file mode 100644
index 000000000..8b1378917
--- /dev/null
+++ b/writerperfect/qa/unit/data/stream/test.dir/styles.xml
@@ -0,0 +1 @@
+
diff --git a/writerperfect/qa/unit/data/stream/test.odt b/writerperfect/qa/unit/data/stream/test.odt
new file mode 100644
index 000000000..5688df4f9
--- /dev/null
+++ b/writerperfect/qa/unit/data/stream/test.odt
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/epubexport/2pages.fodt b/writerperfect/qa/unit/data/writer/epubexport/2pages.fodt
new file mode 100644
index 000000000..ee797e8ac
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/2pages.fodt
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:automatic-styles>
+ <style:style style:name="P1" style:family="paragraph">
+ <style:paragraph-properties fo:break-before="page"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:body>
+ <office:text text:use-soft-page-breaks="true">
+ <text:p>First page</text:p>
+ <text:p text:style-name="P1">Second page</text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/abi11105.abw b/writerperfect/qa/unit/data/writer/epubexport/abi11105.abw
new file mode 100644
index 000000000..cbb326940
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/abi11105.abw
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE abiword PUBLIC "-//ABISOURCE//DTD AWML 1.0 Strict//EN" "http://www.abisource.com/awml.dtd">
+<abiword template="false" styles="unlocked" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:math="http://www.w3.org/1998/Math/MathML" xid-max="602" xmlns:dc="http://purl.org/dc/elements/1.1/" fileformat="1.0" xmlns:svg="http://www.w3.org/2000/svg" xmlns:awml="http://www.abisource.com/awml.dtd" xmlns="http://www.abisource.com/awml.dtd" xmlns:xlink="http://www.w3.org/1999/xlink" version="0.99.2" xml:space="preserve" props="dom-dir:ltr; document-footnote-restart-section:0; document-endnote-type:numeric; document-endnote-place-enddoc:1; document-endnote-initial:1; lang:en-US; document-endnote-restart-section:0; document-footnote-restart-page:0; document-footnote-type:numeric; document-footnote-initial:1; document-endnote-place-endsection:0">
+<!-- ======================================================================== -->
+<!-- This file is an AbiWord document. -->
+<!-- AbiWord is a free, Open Source word processor. -->
+<!-- More information about AbiWord is available at http://www.abisource.com/ -->
+<!-- You should not edit this file by hand. -->
+<!-- ======================================================================== -->
+
+<metadata>
+<m key="dc.format">application/x-abiword</m>
+<m key="abiword.generator">AbiWord</m>
+</metadata>
+<history version="32" edit-time="22699" last-saved="1186591494" uid="cda1ddaa-271c-11dc-96cc-acc9743d883d">
+<version id="9" started="1183217258" uid="f7653120-2729-11dc-96cc-acc9743d883d" auto="0" top-xid="129"/>
+<version id="15" started="1183229488" uid="a162cfda-273d-11dc-9057-9d0956321a55" auto="0" top-xid="395"/>
+<version id="21" started="1183588421" uid="a208dbc8-2a80-11dc-81ef-aecf9c46b62f" auto="0" top-xid="538"/>
+<version id="28" started="1183595753" uid="eb9b7cce-2a9d-11dc-90b3-b9dc9cabd82a" auto="0" top-xid="558"/>
+<version id="29" started="1183748257" uid="c3b1a520-2bf2-11dc-810f-966d8748d82a" auto="0" top-xid="576"/>
+<version id="32" started="1186591321" uid="b0dcc786-45ce-11dc-95e7-b27653668118" auto="0" top-xid="602"/>
+</history>
+<styles>
+<s type="P" name="Normal" followedby="Current Settings" props="font-family:Times New Roman; margin-top:0pt; font-style:normal; font-weight:normal; color:000000; widows:2; margin-bottom:0pt; margin-left:0pt; text-position:normal; line-height:1.0; text-decoration:none; bgcolor:transparent; margin-right:0pt; font-variant:normal; font-size:12pt; text-indent:0in; text-align:left; lang:en-US; font-stretch:normal"/>
+<s type="C" name="Reference" props="font-size:10pt"/>
+</styles>
+<pagesize pagetype="Letter" orientation="portrait" width="8.500000" height="11.000000" units="in" page-scale="1.000000"/>
+<section xid="128" props="page-margin-footer:0.5in; page-margin-header:0.5in">
+<table xid="33" props="list-tag:1; table-column-props:3.8750in/0.9375in/1.6250in/">
+<cell xid="34" props="bg-style:1; left-color:000000; bot-style:1; right-attach:1; right-color:000000; top-color:000000; bot-color:000000; left-attach:0; top-style:0; right-style:0; left-style:0; bot-attach:1; top-attach:0">
+<p style="Normal" xid="35" props="font-family:Times New Roman; text-decoration:none; color:000000; font-size:12pt; text-position:normal; font-weight:normal; font-style:normal"><c props="font-family:Times New Roman; text-decoration:none; color:000000; font-size:12pt; text-position:normal; font-weight:normal; font-style:normal; lang:en-US">Evan Rinehart</c></p>
+<p style="Normal" xid="599" props="font-family:Times New Roman; dom-dir:ltr; font-style:normal; margin-left:0.0000in; lang:en-US; text-decoration:none; text-indent:0.0000in; text-position:normal; margin-top:0.0000in; font-weight:bold; margin-right:0.0000in; margin-bottom:0.0000in; font-size:12pt; line-height:1.000000; text-align:left"><c props="font-family:Times New Roman; font-size:12pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">P.O. Box 21456</c></p>
+<p style="Normal" xid="600" props="font-family:Times New Roman; dom-dir:ltr; font-style:normal; margin-left:0.0000in; lang:en-US; text-decoration:none; text-indent:0.0000in; text-position:normal; margin-top:0.0000in; font-weight:bold; margin-right:0.0000in; margin-bottom:0.0000in; font-size:12pt; line-height:1.000000; text-align:left"><c props="font-family:Times New Roman; font-size:12pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">Baton Rouge, LA 70894</c></p>
+<p style="Normal" xid="601" props="font-family:Times New Roman; dom-dir:ltr; font-style:normal; margin-left:0.0000in; lang:en-US; text-decoration:none; text-indent:0.0000in; text-position:normal; margin-top:0.0000in; font-weight:bold; margin-right:0.0000in; margin-bottom:0.0000in; font-size:12pt; line-height:1.000000; text-align:left"><c props="font-family:Times New Roman; font-size:12pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">(985) 806 4063</c></p>
+<p style="Normal" xid="602" props="font-family:Times New Roman; dom-dir:ltr; font-style:normal; margin-left:0.0000in; lang:en-US; text-decoration:none; text-indent:0.0000in; text-position:normal; margin-top:0.0000in; font-weight:bold; margin-right:0.0000in; margin-bottom:0.0000in; font-size:12pt; line-height:1.000000; text-align:left"><c props="font-family:Times New Roman; font-size:12pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">evanrinehart@gmail.com</c></p>
+</cell>
+<cell xid="37" props="bg-style:1; left-color:000000; bot-style:1; right-attach:3; right-color:000000; top-color:000000; bot-color:000000; left-attach:1; top-style:0; right-style:0; left-style:0; bot-attach:1; top-attach:0">
+<p style="Normal" xid="38"></p>
+</cell>
+<cell xid="40" props="bot-style:0; right-attach:3; bg-style:1; top-color:000000; bot-color:000000; left-attach:0; left-style:0; right-style:0; top-style:1; bot-attach:2; top-attach:1">
+<p style="Normal" xid="41"></p>
+<p style="Normal" xid="118"></p>
+</cell>
+<cell xid="46" props="bot-style:1; right-attach:1; bg-style:1; top-color:000000; bot-color:000000; left-attach:0; left-style:0; right-style:0; top-style:0; bot-attach:3; top-attach:2">
+<p style="Normal" xid="47"><c props="text-decoration:none; font-weight:bold">Work Experience</c></p>
+</cell>
+<cell xid="49" props="bot-style:1; right-attach:3; bg-style:1; top-color:000000; bot-color:000000; left-attach:1; left-style:0; right-style:0; top-style:0; bot-attach:3; top-attach:2">
+<p style="Normal" xid="50" props="font-family:Times New Roman; text-decoration:none; color:000000; font-size:12pt; text-position:normal; font-weight:normal; font-style:normal"></p>
+</cell>
+<cell xid="587" props="left-color:000000; bot-style:0; right-attach:1; right-color:000000; bg-style:1; left-attach:0; top-attach:3; bot-attach:4; bot-color:000000; right-style:0; left-style:0">
+<p xid="588"><c props="font-style:italic; font-size:10pt">RageComm</c></p>
+<p xid="596"><c props="font-size:10pt">Aug 2007 - </c></p>
+<p xid="598"></p>
+</cell>
+<cell xid="590" props="bg-style:1; bot-style:0; right-attach:3; left-attach:1; right-style:0; left-style:0; bot-attach:4; top-attach:3">
+<p xid="591"><c props="font-size:10pt">Programmer</c></p>
+<p xid="597" props="font-size:8pt"><c props="font-size:8pt">Researching and implementing advanced graphics techniques using shaders; providing general support.</c></p>
+</cell>
+<cell xid="52" props="bg-style:1; bot-style:0; right-attach:1; top-color:000000; top-attach:4; left-attach:0; left-style:0; bot-attach:5; bot-color:000000; right-style:0; top-style:0">
+<p style="Normal" xid="53" props="font-family:Times New Roman; text-decoration:none; color:000000; font-size:12pt; text-position:normal; font-weight:normal; font-style:normal"><c props="font-family:Times New Roman; font-size:10pt; color:000000; text-decoration:none; text-position:normal; font-weight:normal; font-style:italic; lang:en-US">LSU Student Technical Application Resource Training</c></p>
+<p style="Normal" xid="574" props="margin-top:0.0000in; margin-left:0.0000in; text-indent:0.0000in; dom-dir:ltr; margin-bottom:0.0000in; line-height:1.000000; text-align:left; margin-right:0.0000in"><c props="font-family:Times New Roman; font-size:10pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">Aug 2006 - May 2007</c></p>
+<p style="Normal" xid="174" props="font-family:Times New Roman; dom-dir:ltr; font-style:normal; margin-left:0.0000in; text-position:normal; lang:en-US; margin-bottom:0.0000in; text-indent:0.0000in; text-align:left; margin-top:0.0000in; font-weight:normal; line-height:1.000000; text-decoration:none; color:000000; margin-right:0.0000in; font-size:10pt"></p>
+</cell>
+<cell xid="92" props="bg-style:1; bot-style:0; right-attach:3; top-color:000000; top-attach:4; left-attach:1; left-style:0; bot-attach:5; bot-color:000000; right-style:0; top-style:0">
+<p xid="93" props="font-family:Times New Roman; font-size:12pt; color:000000; text-decoration:none; text-position:normal; font-weight:normal; font-style:normal"><c props="font-family:Times New Roman; font-size:10pt; color:000000; text-decoration:none; text-position:normal; font-weight:normal; font-style:normal; lang:en-US">Software Trainer</c></p>
+<p style="Normal" xid="570" props="font-family:Times New Roman; dom-dir:ltr; font-style:normal; margin-left:0.0000in; lang:en-US; text-decoration:none; text-indent:0.0000in; text-position:normal; margin-top:0.0000in; font-weight:normal; margin-right:0.0000in; margin-bottom:0.0000in; font-size:8pt; line-height:1.000000; text-align:left"><c props="font-family:Times New Roman; font-size:8pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">Taught classes in MATLAB, Mathematica, web design, and Linux system administration.</c></p>
+</cell>
+<cell xid="58" props="bot-style:0; right-attach:1; bg-style:1; top-color:000000; bot-color:000000; left-attach:0; left-style:0; right-style:0; top-style:0; bot-attach:6; top-attach:5">
+<p style="Normal" xid="59" props="font-family:Times New Roman; text-decoration:none; color:000000; font-size:12pt; text-position:normal; font-weight:normal; font-style:normal"><c props="font-family:Times New Roman; font-size:10pt; color:000000; text-decoration:none; text-position:normal; font-weight:normal; font-style:italic; lang:en-US">LSU Department of Electrical and Computer Engineering</c></p>
+<p style="Normal" xid="576" props="margin-top:0.0000in; margin-left:0.0000in; text-indent:0.0000in; dom-dir:ltr; margin-bottom:0.0000in; line-height:1.000000; text-align:left; margin-right:0.0000in"><c props="font-family:Times New Roman; font-size:10pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">Jan 2006 - May 2007</c></p>
+<p style="Normal" xid="175" props="font-family:Times New Roman; dom-dir:ltr; font-style:normal; margin-left:0.0000in; text-position:normal; lang:en-US; margin-bottom:0.0000in; text-indent:0.0000in; text-align:left; margin-top:0.0000in; font-weight:normal; line-height:1.0; text-decoration:none; color:000000; margin-right:0.0000in; font-size:10pt"></p>
+</cell>
+<cell xid="61" props="left-attach:1; right-attach:3; bot-style:0; bot-attach:6; top-attach:5; right-style:0; top-style:0; bg-style:1; left-style:0">
+<p style="Normal" xid="62" props="font-family:Times New Roman; font-size:12pt; color:000000; text-decoration:none; text-position:normal; font-weight:normal; font-style:normal"><c props="font-family:Times New Roman; font-size:10pt; color:000000; text-decoration:none; text-position:normal; font-weight:normal; font-style:normal; lang:en-US">Engineering Tutor</c></p>
+<p style="Normal" xid="572" props="font-family:Times New Roman; dom-dir:ltr; font-style:normal; margin-left:0.0000in; lang:en-US; text-decoration:none; text-indent:0.0000in; text-position:normal; margin-top:0.0000in; font-weight:normal; margin-right:-0.1250in; margin-bottom:0.0000in; font-size:8pt; line-height:1.000000; text-align:left"><c props="font-family:Times New Roman; font-size:8pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">Tutored engineering students in circuits, digital logic, electronics, and software engineering.</c></p>
+</cell>
+<cell xid="64" props="bot-style:0; right-attach:1; bg-style:1; top-color:000000; bot-color:000000; left-attach:0; left-style:0; right-style:0; top-style:0; bot-attach:7; top-attach:6">
+<p style="Normal" xid="65" props="font-family:Times New Roman; text-decoration:none; color:000000; font-size:12pt; text-position:normal; font-weight:normal; font-style:normal"><c props="font-family:Times New Roman; font-size:10pt; color:000000; text-decoration:none; text-position:normal; font-weight:normal; font-style:italic; lang:en-US">LSU Department of Mathematics</c></p>
+<p style="Normal" xid="575" props="margin-top:0.0000in; margin-left:0.0000in; text-indent:0.0000in; dom-dir:ltr; margin-bottom:0.0000in; line-height:1.000000; text-align:left; margin-right:0.0000in"><c props="font-family:Times New Roman; font-size:10pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">Aug 2005 - May 2006</c></p>
+<p style="Normal" xid="176" props="font-family:Times New Roman; dom-dir:ltr; font-style:normal; margin-left:0.0000in; text-position:normal; lang:en-US; margin-bottom:0.0000in; text-indent:0.0000in; text-align:left; margin-top:0.0000in; font-weight:normal; line-height:1.000000; text-decoration:none; color:000000; margin-right:0.0000in; font-size:10pt"></p>
+</cell>
+<cell xid="95" props="left-attach:1; right-attach:3; bot-style:0; bot-attach:7; top-attach:6; right-style:0; left-style:0; top-style:0">
+<p xid="96" props="font-family:Times New Roman; font-size:12pt; color:000000; text-decoration:none; text-position:normal; font-weight:normal; font-style:normal"><c props="font-family:Times New Roman; font-size:10pt; color:000000; text-decoration:none; text-position:normal; font-weight:normal; font-style:normal; lang:en-US">Software Trainer / Math Tutor</c></p>
+<p style="Normal" xid="571" props="font-family:Times New Roman; dom-dir:ltr; font-style:normal; margin-left:0.0000in; lang:en-US; text-decoration:none; text-indent:0.0000in; text-position:normal; margin-top:0.0000in; font-weight:normal; margin-right:0.0000in; margin-bottom:0.0000in; font-size:8pt; line-height:1.000000; text-align:left"><c props="font-family:Times New Roman; font-size:8pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">Assisted students enrolled in computer-based college algebra program.</c></p>
+</cell>
+<cell xid="70" props="bot-style:0; right-attach:1; bg-style:1; top-color:000000; bot-color:000000; left-attach:0; left-style:0; right-style:0; top-style:0; bot-attach:8; top-attach:7">
+<p style="Normal" xid="71" props="font-family:Times New Roman; text-decoration:none; color:000000; font-size:12pt; text-position:normal; font-weight:normal; font-style:normal"><c props="font-family:Times New Roman; font-size:10pt; color:000000; text-decoration:none; text-position:normal; font-weight:normal; font-style:italic; lang:en-US">LSU School of Veterinary Medicine</c></p>
+<p style="Normal" xid="573" props="margin-top:0.0000in; margin-left:0.0000in; text-indent:0.0000in; dom-dir:ltr; margin-bottom:0.0000in; line-height:1.000000; text-align:left; margin-right:0.0000in"><c props="font-family:Times New Roman; font-size:10pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">Jun 2004 - Aug 2005</c></p>
+<p style="Normal" xid="177" props="font-family:Times New Roman; dom-dir:ltr; font-style:normal; margin-left:0.0000in; text-position:normal; lang:en-US; margin-bottom:0.0000in; text-indent:0.0000in; text-align:left; margin-top:0.0000in; font-weight:normal; line-height:1.000000; text-decoration:none; color:000000; margin-right:0.0000in; font-size:10pt"></p>
+</cell>
+<cell xid="73" props="left-attach:1; right-attach:3; bot-style:0; bot-attach:8; top-attach:7; right-style:0; top-style:0; bg-style:1; left-style:0">
+<p style="Normal" xid="74" props="font-family:Times New Roman; font-size:12pt; color:000000; text-decoration:none; text-position:normal; font-weight:normal; font-style:normal"><c props="font-family:Times New Roman; font-size:10pt; color:000000; text-decoration:none; text-position:normal; font-weight:normal; font-style:normal; lang:en-US">Entry-Level Network Technician</c></p>
+<p style="Normal" xid="569" props="font-family:Times New Roman; dom-dir:ltr; font-style:normal; margin-left:0.0000in; lang:en-US; text-decoration:none; text-indent:0.0000in; text-position:normal; margin-top:0.0000in; font-weight:normal; margin-right:-0.0625in; margin-bottom:0.0000in; font-size:8pt; line-height:1.000000; text-align:left"><c props="font-family:Times New Roman; font-size:8pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">Installed and maintained network hardware throughout hospital and research facility.</c></p>
+</cell>
+</table>
+<p xid="369"></p>
+<table xid="130" props="list-tag:1; bot-style:0; table-column-props:3.8750in/2.5625in/; top-style:0; right-style:0; bg-style:1; left-style:0">
+<cell xid="152" props="bg-style:1; left-color:000000; bot-style:1; right-attach:2; right-color:000000; top-color:000000; top-attach:0; left-attach:0; left-style:0; bot-attach:1; bot-color:000000; right-style:0; top-style:0">
+<p xid="467"><c props="font-weight:bold; text-decoration:none">Education</c></p>
+</cell>
+<cell xid="134" props="bot-style:0; right-attach:1; bg-style:1; top-color:000000; left-style:0; left-attach:0; top-attach:1; bot-attach:2; bot-color:000000; right-style:0; top-style:1">
+<p style="Normal" xid="135"><c props="font-size:10pt">Bachelor of Science in Electrical Engineering</c></p>
+<p style="Normal" xid="559"><c props="font-size:10pt">Louisiana State University, 2007</c></p>
+</cell>
+<cell xid="137" props="bot-style:0; right-attach:2; bg-style:1; top-color:000000; left-style:0; left-attach:1; top-attach:1; bot-attach:2; bot-color:000000; right-style:0; top-style:1">
+<p style="Normal" xid="138"><c props="font-size:8pt">Concentration in Computer Engineering</c></p>
+<p style="Normal" xid="150"><c props="font-size:8pt">Minor in Physics</c></p>
+<p style="Normal" xid="151"><c props="font-size:8pt">Minor in Computer Science</c></p>
+<p style="Normal" xid="556"><c props="font-size:8pt">Major GPA: 3.24</c></p>
+<p style="Normal" xid="567"></p>
+</cell>
+<cell xid="143" props="bot-attach:3; left-attach:0; right-attach:1; top-attach:2">
+<p style="Normal" xid="144"><c props="font-size:10pt">Bachelor of Science in Mathematics</c></p>
+<p style="Normal" xid="560"><c props="font-size:10pt">Louisiana State University, Expected 2008</c></p>
+</cell>
+<cell xid="146" props="bot-attach:3; left-attach:1; right-attach:2; top-attach:2">
+<p style="Normal" xid="147"><c props="font-size:8pt">Concentration in Pure Math</c></p>
+<p style="Normal" xid="558"><c props="font-size:8pt">Major GPA: 3.44</c></p>
+</cell>
+</table>
+<p xid="370"></p>
+<table xid="506" props="list-tag:1; bg-style:1; left-color:000000; bot-style:0; table-column-props:3.8750in/2.5625in/; right-color:000000; top-color:000000; left-style:0; bot-color:000000; right-style:0; top-style:0">
+<cell xid="507" props="left-attach:0; right-attach:2; bot-style:1; bot-attach:1; top-attach:0; bot-color:000000; right-style:0; top-style:0; bg-style:1; left-style:0">
+<p style="Normal" xid="508" props="margin-top:0.0000in; margin-left:0.0000in; text-indent:0.0000in; dom-dir:ltr; margin-bottom:0.0000in; line-height:1.000000; text-align:left; margin-right:0.0000in"><c props="font-family:Times New Roman; text-decoration:none; color:000000; font-size:12pt; text-position:normal; font-weight:bold; font-style:normal; lang:en-US">Former Supervisors</c></p>
+</cell>
+<cell xid="513" props="left-attach:0; right-attach:1; bot-style:0; bot-attach:2; top-attach:1; right-style:0; left-style:0; bg-style:1; top-style:1">
+<p style="Normal" xid="514" props="margin-top:0.0000in; margin-left:0.0000in; text-indent:0.0000in; dom-dir:ltr; margin-bottom:0.0000in; line-height:1.000000; text-align:left; margin-right:0.0000in"><c props="font-family:Times New Roman; font-size:10pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">Mark Rabalais</c></p>
+<p style="Normal" xid="515" props="margin-top:0.0000in; margin-left:0.0000in; text-indent:0.0000in; dom-dir:ltr; margin-bottom:0.0000in; line-height:1.000000; text-align:left; margin-right:0.0000in"><c props="font-family:Times New Roman; font-size:10pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">Instructor</c></p>
+<p style="Normal" xid="516" props="margin-top:0.0000in; margin-left:0.0000in; text-indent:0.0000in; dom-dir:ltr; margin-bottom:0.0000in; line-height:1.000000; text-align:left; margin-right:0.0000in"><c props="font-family:Times New Roman; font-size:10pt; lang:en-US; text-position:normal; font-weight:normal; font-style:italic; text-decoration:none">LSU Department of Electrical and Computer Engineering</c></p>
+</cell>
+<cell xid="518" props="left-attach:1; right-attach:2; bot-style:0; bot-attach:2; top-attach:1; right-style:0; left-style:0; bg-style:1; top-style:1">
+<p style="Normal" xid="519" props="margin-top:0.0000in; margin-left:0.0000in; text-indent:0.0000in; dom-dir:ltr; margin-bottom:0.0000in; line-height:1.000000; text-align:left; margin-right:0.0000in"></p>
+<p style="Normal" xid="545" props="margin-top:0.0000in; margin-left:0.0000in; text-indent:0.0000in; dom-dir:ltr; margin-bottom:0.0000in; line-height:1.000000; text-align:left; margin-right:0.0000in"><c props="font-family:Times New Roman; font-size:10pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">Phone: (225) 578 5200</c></p>
+<p style="Normal" xid="520" props="margin-top:0.0000in; margin-left:0.0000in; text-indent:0.0000in; dom-dir:ltr; margin-bottom:0.0000in; line-height:1.000000; text-align:left; margin-right:0.0000in"><c props="font-family:Times New Roman; font-size:10pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">Email: mrabal@lsu.edu</c></p>
+</cell>
+<cell xid="522" props="bot-attach:3; left-attach:0; right-attach:1; top-attach:2">
+<p style="Normal" xid="523" props="margin-top:0.0000in; margin-left:0.0000in; text-indent:0.0000in; dom-dir:ltr; margin-bottom:0.0000in; line-height:1.000000; text-align:left; margin-right:0.0000in"><c props="font-family:Times New Roman; font-size:10pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">Melissa Brocato</c></p>
+<p style="Normal" xid="524" props="margin-top:0.0000in; margin-left:0.0000in; text-indent:0.0000in; dom-dir:ltr; margin-bottom:0.0000in; line-height:1.000000; text-align:left; margin-right:0.0000in"><c props="font-family:Times New Roman; font-size:10pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">Director</c></p>
+<p style="Normal" xid="525" props="margin-top:0.0000in; margin-left:0.0000in; text-indent:0.0000in; dom-dir:ltr; margin-bottom:0.0000in; line-height:1.000000; text-align:left; margin-right:0.0000in"><c props="font-family:Times New Roman; font-size:10pt; lang:en-US; text-position:normal; font-weight:normal; font-style:italic; text-decoration:none">LSU Student Technical Application Resource Training</c></p>
+</cell>
+<cell xid="527" props="bot-attach:3; left-attach:1; right-attach:2; top-attach:2">
+<p style="Normal" xid="528" props="margin-top:0.0000in; margin-left:0.0000in; text-indent:0.0000in; dom-dir:ltr; margin-bottom:0.0000in; line-height:1.000000; text-align:left; margin-right:0.0000in"></p>
+<p style="Normal" xid="546" props="margin-top:0.0000in; margin-left:0.0000in; text-indent:0.0000in; dom-dir:ltr; margin-bottom:0.0000in; line-height:1.000000; text-align:left; margin-right:0.0000in"><c props="font-family:Times New Roman; font-size:10pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">Phone: (225) 578 4526</c></p>
+<p style="Normal" xid="529" props="margin-top:0.0000in; margin-left:0.0000in; text-indent:0.0000in; dom-dir:ltr; margin-bottom:0.0000in; line-height:1.000000; text-align:left; margin-right:0.0000in"><c props="font-family:Times New Roman; font-size:10pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">Email: mbrocato@lsu.edu</c></p>
+</cell>
+</table>
+<p xid="532" props="margin-top:0.0000in; margin-left:0.0000in; text-indent:0.0000in; dom-dir:ltr; margin-bottom:0.0000in; line-height:1.000000; text-align:left; margin-right:0.0000in"></p>
+<table xid="399" props="list-tag:1; bot-style:0; table-column-props:1.6250in/4.8125in/; top-style:0; top-color:000000; right-style:0; bg-style:1; left-style:0">
+<cell xid="455" props="left-attach:0; right-attach:1; bot-style:1; bot-attach:1; top-attach:0; bot-color:000000; right-style:0; left-style:0; bg-style:1; top-style:0">
+<p xid="456"><c props="font-weight:bold">Skills</c></p>
+</cell>
+<cell xid="458" props="left-attach:1; right-attach:2; bot-style:1; bot-attach:1; top-attach:0; bot-color:000000; right-style:0; left-style:0; bg-style:1; top-style:0">
+<p xid="459"></p>
+</cell>
+<cell xid="400" props="bot-style:0; right-attach:1; bg-style:1; top-color:000000; left-style:0; left-attach:0; top-attach:1; bot-attach:2; bot-color:000000; right-style:0; top-style:1">
+<p style="Normal" xid="401"><c props="font-family:Times New Roman; text-decoration:none; color:000000; font-size:10pt; text-position:normal; font-weight:normal; font-style:normal; lang:en-US">Languages</c></p>
+</cell>
+<cell xid="403" props="bot-style:0; right-attach:2; bg-style:1; top-color:000000; left-style:0; left-attach:1; top-attach:1; bot-attach:2; bot-color:000000; right-style:0; top-style:1">
+<p style="Normal" xid="404" props="font-family:Times New Roman; font-size:12pt; color:000000; text-decoration:none; text-position:normal; font-weight:normal; font-style:normal"><c props="font-family:Times New Roman; text-decoration:none; color:000000; font-size:10pt; text-position:normal; font-weight:normal; font-style:normal; lang:en-US">C, </c><c props="font-family:Times New Roman; font-size:10pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">C++, Java, Perl, Python, Lua, Cg, Others</c></p>
+</cell>
+<cell xid="406" props="bot-attach:3; left-attach:0; right-attach:1; top-attach:2">
+<p style="Normal" xid="407"><c props="font-family:Times New Roman; text-decoration:none; color:000000; font-size:10pt; text-position:normal; font-weight:normal; font-style:normal; lang:en-US">Server Software</c></p>
+</cell>
+<cell xid="409" props="bot-attach:3; left-attach:1; right-attach:2; top-attach:2">
+<p style="Normal" xid="410" props="font-family:Times New Roman; font-size:12pt; color:000000; text-decoration:none; text-position:normal; font-weight:normal; font-style:normal"><c props="font-family:Times New Roman; text-decoration:none; color:000000; font-size:10pt; text-position:normal; font-weight:normal; font-style:normal; lang:en-US">Apache, </c><c props="font-family:Times New Roman; font-size:10pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">BIND, </c><c props="font-family:Times New Roman; text-decoration:none; color:000000; font-size:10pt; text-position:normal; font-weight:normal; font-style:normal; lang:en-US">CVS / SVN, </c><c props="font-family:Times New Roman; font-size:10pt; color:000000; text-decoration:none; text-position:normal; font-weight:normal; font-style:normal; lang:en-US">DHCP, </c><c props="font-family:Times New Roman; font-size:10pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">MySQL, Others</c></p>
+</cell>
+<cell xid="412" props="bot-attach:4; left-attach:0; right-attach:1; top-attach:3">
+<p style="Normal" xid="413"><c props="font-family:Times New Roman; text-decoration:none; color:000000; font-size:10pt; text-position:normal; font-weight:normal; font-style:normal; lang:en-US">Operating Systems</c></p>
+</cell>
+<cell xid="415" props="bot-attach:4; left-attach:1; right-attach:2; top-attach:3">
+<p style="Normal" xid="416" props="font-family:Times New Roman; font-size:12pt; color:000000; text-decoration:none; text-position:normal; font-weight:normal; font-style:normal"><c props="font-family:Times New Roman; text-decoration:none; color:000000; font-size:10pt; text-position:normal; font-weight:normal; font-style:normal; lang:en-US">Linux, </c><c props="font-family:Times New Roman; font-size:10pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">OpenBSD, OpenSolaris, Windows XP / Server 2003, Others</c></p>
+</cell>
+<cell xid="418" props="bot-attach:5; left-attach:0; right-attach:1; top-attach:4">
+<p style="Normal" xid="419"><c props="font-family:Times New Roman; text-decoration:none; color:000000; font-size:10pt; text-position:normal; font-weight:normal; font-style:normal; lang:en-US">WWW</c></p>
+</cell>
+<cell xid="421" props="bot-attach:5; left-attach:1; right-attach:2; top-attach:4">
+<p style="Normal" xid="422" props="font-family:Times New Roman; font-size:12pt; color:000000; text-decoration:none; text-position:normal; font-weight:normal; font-style:normal"><c props="font-family:Times New Roman; text-decoration:none; color:000000; font-size:10pt; text-position:normal; font-weight:normal; font-style:normal; lang:en-US">HTML, XHTML, </c><c props="font-family:Times New Roman; font-size:10pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">CSS, PHP</c></p>
+</cell>
+<cell xid="424" props="bot-attach:6; left-attach:0; right-attach:1; top-attach:5">
+<p style="Normal" xid="425"><c props="font-family:Times New Roman; text-decoration:none; color:000000; font-size:10pt; text-position:normal; font-weight:normal; font-style:normal; lang:en-US">Network</c></p>
+</cell>
+<cell xid="427" props="bot-attach:6; left-attach:1; right-attach:2; top-attach:5">
+<p style="Normal" xid="428" props="font-family:Times New Roman; font-size:12pt; color:000000; text-decoration:none; text-position:normal; font-weight:normal; font-style:normal"><c props="font-family:Times New Roman; text-decoration:none; color:000000; font-size:10pt; text-position:normal; font-weight:normal; font-style:normal; lang:en-US">iptables, packetfilter, </c><c props="font-family:Times New Roman; font-size:10pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">IPv6, SMB / CIFS, BSD sockets</c></p>
+</cell>
+<cell xid="430" props="bot-attach:7; left-attach:0; right-attach:1; top-attach:6">
+<p style="Normal" xid="431"><c props="font-family:Times New Roman; text-decoration:none; color:000000; font-size:10pt; text-position:normal; font-weight:normal; font-style:normal; lang:en-US">Linux</c></p>
+</cell>
+<cell xid="433" props="bot-attach:7; left-attach:1; right-attach:2; top-attach:6">
+<p style="Normal" xid="434" props="font-family:Times New Roman; font-size:12pt; color:000000; text-decoration:none; text-position:normal; font-weight:normal; font-style:normal"><c props="font-family:Times New Roman; text-decoration:none; color:000000; font-size:10pt; text-position:normal; font-weight:normal; font-style:normal; lang:en-US">bash, </c><c props="font-family:Times New Roman; font-size:10pt; lang:en-US; text-position:normal; font-weight:normal; font-style:normal; text-decoration:none">dpkg, rpm, portage, pthreads, </c><c props="font-family:Times New Roman; text-decoration:none; color:000000; font-size:10pt; text-position:normal; font-weight:normal; font-style:normal; lang:en-US">kernel configuration, X window system</c></p>
+</cell>
+<cell xid="550" props="bot-attach:8; left-attach:0; right-attach:1; top-attach:7">
+<p xid="551"><c props="font-size:10pt">Engineering</c></p>
+</cell>
+<cell xid="553" props="bot-attach:8; left-attach:1; right-attach:2; top-attach:7">
+<p xid="554"><c props="font-size:10pt">Electronics, Logic Design, Computer Architecture, Communications Technology</c></p>
+</cell>
+</table>
+<p style="Normal" xid="129"></p>
+</section>
+</abiword>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/char-namedstyle.fodt b/writerperfect/qa/unit/data/writer/epubexport/char-namedstyle.fodt
new file mode 100644
index 000000000..5a1b3823d
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/char-namedstyle.fodt
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:font-face-decls>
+ <style:font-face style:name="Liberation Mono" svg:font-family="&apos;Liberation Mono&apos;" style:font-family-generic="modern" style:font-pitch="fixed"/>
+ </office:font-face-decls>
+ <office:styles>
+ <style:style style:name="Source_20_Text" style:display-name="Source Text" style:family="text">
+ <style:text-properties style:font-name="Liberation Mono" fo:font-family="&apos;Liberation Mono&apos;" style:font-family-generic="modern" style:font-pitch="fixed"/>
+ </style:style>
+ </office:styles>
+ <office:body>
+ <office:text>
+ <text:p>Foo<text:span text:style-name="Source_20_Text">bar</text:span></text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/escape.fodt b/writerperfect/qa/unit/data/writer/epubexport/escape.fodt
new file mode 100644
index 000000000..8d23fb36e
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/escape.fodt
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:officeooo="http://openoffice.org/2009/office" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:automatic-styles>
+ <style:style style:name="T1" style:family="text">
+ <style:text-properties officeooo:rsid="0006b966"/>
+ </style:style>
+ <style:style style:name="T2" style:family="text">
+ <style:text-properties fo:font-weight="bold" officeooo:rsid="0006b966" style:font-weight-asian="bold" style:font-weight-complex="bold"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:body>
+ <office:text>
+ <text:p><text:s/><text:span text:style-name="T1">a&amp;b</text:span><text:span text:style-name="T2"><text:tab/></text:span></text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/font-embedding.fodt b/writerperfect/qa/unit/data/writer/epubexport/font-embedding.fodt
new file mode 100644
index 000000000..ac241503d
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/font-embedding.fodt
@@ -0,0 +1,2657 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:settings>
+ <config:config-item-set config:name="ooo:view-settings">
+ <config:config-item config:name="ViewAreaTop" config:type="long">0</config:config-item>
+ <config:config-item config:name="ViewAreaLeft" config:type="long">0</config:config-item>
+ <config:config-item config:name="ViewAreaWidth" config:type="long">48553</config:config-item>
+ <config:config-item config:name="ViewAreaHeight" config:type="long">22888</config:config-item>
+ <config:config-item config:name="ShowRedlineChanges" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="InBrowseMode" config:type="boolean">false</config:config-item>
+ <config:config-item-map-indexed config:name="Views">
+ <config:config-item-map-entry>
+ <config:config-item config:name="ViewId" config:type="string">view2</config:config-item>
+ <config:config-item config:name="ViewLeft" config:type="long">6653</config:config-item>
+ <config:config-item config:name="ViewTop" config:type="long">2501</config:config-item>
+ <config:config-item config:name="VisibleLeft" config:type="long">0</config:config-item>
+ <config:config-item config:name="VisibleTop" config:type="long">0</config:config-item>
+ <config:config-item config:name="VisibleRight" config:type="long">48551</config:config-item>
+ <config:config-item config:name="VisibleBottom" config:type="long">22886</config:config-item>
+ <config:config-item config:name="ZoomType" config:type="short">0</config:config-item>
+ <config:config-item config:name="ViewLayoutColumns" config:type="short">0</config:config-item>
+ <config:config-item config:name="ViewLayoutBookMode" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="ZoomFactor" config:type="short">100</config:config-item>
+ <config:config-item config:name="IsSelectedFrame" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="AnchoredTextOverflowLegacy" config:type="boolean">false</config:config-item>
+ </config:config-item-map-entry>
+ </config:config-item-map-indexed>
+ </config:config-item-set>
+ <config:config-item-set config:name="ooo:configuration-settings">
+ <config:config-item config:name="PrintProspect" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="PrintLeftPages" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="PrintGraphics" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="PrintPageBackground" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="PrintControls" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="PrintAnnotationMode" config:type="short">0</config:config-item>
+ <config:config-item config:name="PrintRightPages" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="PrintFaxName" config:type="string"/>
+ <config:config-item config:name="PrintPaperFromSetup" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="PrintTextPlaceholder" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="ApplyParagraphMarkFormatToNumbering" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="PrintReversed" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="TabOverMargin" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="EmbedFonts" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="SurroundTextWrapSmall" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="BackgroundParaOverDrawings" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="ClippedPictures" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="FloattableNomargins" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="UnbreakableNumberings" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="EmbedSystemFonts" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="TabOverflow" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="PrintTables" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="PrintSingleJobs" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="SmallCapsPercentage66" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="CollapseEmptyCellPara" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="TreatSingleColumnBreakAsPageBreak" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="MathBaselineAlignment" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="AddFrameOffsets" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsLabelDocument" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="PrinterName" config:type="string"/>
+ <config:config-item config:name="OutlineLevelYieldsNumbering" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="MsWordCompTrailingBlanks" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IgnoreFirstLineIndentInNumbering" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="UpdateFromTemplate" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="PrintBlackFonts" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="TableRowKeep" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="EmbeddedDatabaseName" config:type="string"/>
+ <config:config-item config:name="IgnoreTabsAndBlanksForLineCalculation" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="UseOldPrinterMetrics" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="InvertBorderSpacing" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="SaveGlobalDocumentLinks" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="TabsRelativeToIndent" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="Rsid" config:type="int">314478</config:config-item>
+ <config:config-item config:name="PrintProspectRTL" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="PrintEmptyPages" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="ApplyUserData" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="PrintHiddenText" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="AddParaTableSpacingAtStart" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="FieldAutoUpdate" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="UseOldNumbering" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="AddParaTableSpacing" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="CharacterCompressionType" config:type="short">0</config:config-item>
+ <config:config-item config:name="SaveVersionOnClose" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="ChartAutoUpdate" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="PrinterIndependentLayout" config:type="string">high-resolution</config:config-item>
+ <config:config-item config:name="IsKernAsianPunctuation" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="UseFormerObjectPositioning" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="AddVerticalFrameOffsets" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="SubtractFlysAnchoredAtFlys" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="AddParaSpacingToTableCells" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="AddExternalLeading" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="CurrentDatabaseDataSource" config:type="string">writer-data-source-ooxml</config:config-item>
+ <config:config-item config:name="AllowPrintJobCancel" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="ProtectForm" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="UseFormerLineSpacing" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="PrintDrawings" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="UseFormerTextWrapping" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="UnxForceZeroExtLeading" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="TabAtLeftIndentForParagraphsInList" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="RedlineProtectionKey" config:type="base64Binary"/>
+ <config:config-item config:name="PropLineSpacingShrinksFirstLine" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="ConsiderTextWrapOnObjPos" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="RsidRoot" config:type="int">314478</config:config-item>
+ <config:config-item config:name="StylesNoDefault" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="LinkUpdateMode" config:type="short">1</config:config-item>
+ <config:config-item config:name="AlignTabStopPosition" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="DoNotJustifyLinesWithManualBreak" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="DoNotResetParaAttrsForNumFont" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="CurrentDatabaseCommandType" config:type="int">0</config:config-item>
+ <config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="DoNotCaptureDrawObjsOnPage" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="CurrentDatabaseCommand" config:type="string">Table1</config:config-item>
+ <config:config-item config:name="PrinterSetup" config:type="base64Binary"/>
+ <config:config-item config:name="ClipAsCharacterAnchoredWriterFlyFrames" config:type="boolean">false</config:config-item>
+ </config:config-item-set>
+ </office:settings>
+ <office:scripts>
+ <office:script script:language="ooo:Basic">
+ <ooo:libraries xmlns:ooo="http://openoffice.org/2004/office" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+ </office:script>
+ </office:scripts>
+ <office:font-face-decls>
+ <style:font-face style:name="SketchFlow Print" svg:font-family="&apos;SketchFlow Print&apos;" style:font-family-generic="roman" style:font-pitch="variable">
+ <svg:font-face-src>
+ <svg:font-face-uri loext:font-style="normal" loext:font-weight="normal">
+ <office:binary-data>AAEAAAAUAQAABABARFNJRzfRQ3UAAdkYAAAbnEdQT1MkQqBJAAH0tAAAFaRHU1VC2mzdsAAC
+ ClgAAABYTFRTSErIqbcAAAhgAAABkk9TLzK4ec1/AAAByAAAAGBWRE1YZUZsuAAACfQAAAXg
+ Y21hcIGuWR0AADPMAAAGjmN2dCAIkwJmAAA8eAAAACBmcGdtBlmcNwAAOlwAAAFzZ2FzcAAX
+ AAkAAdkIAAAAEGdseWZGr7RbAAA/uAABjnxoZG14gZErxQAAD9QAACP4aGVhZPLtvvoAAAFM
+ AAAANmhoZWEOQQbZAAABhAAAACRobXR4UCaEqQAAAigAAAY4bG9jYVnq+JQAADyYAAADHm1h
+ eHADowTPAAABqAAAACBuYW1lYAWWKQABzjQAAAJ2cG9zdJZZNaMAAdCsAAAIW3ByZXBQ0h19
+ AAA70AAAAKgAAQAAAAECj0muuKhfDzz1ABkIAAAAAADF3g7UAAAAAMYKY4n+K/1UCa0HvAAA
+ AAkAAgAAAAAAAAABAAAGZv4AAAAJff4r/c0JrQABAAAAAAAAAAAAAAAAAAABjgABAAABjgDZ
+ AAQA1wAEAAEAAAAAAAoAAAIAAx0AAgABAAIEIgGQAAUACAWaBTMAAAEfBZoFMwAAA9EAZgIA
+ AAACAAAAAAAAAAAAoAAAr0AAIEoAAAAAAAAAAG1sc3MAQAAg+wIGZv4AAAAGZgIAIAABk00A
+ AAADqAThAAAAIAACA5oAAAAAAAADmgAAA5oAAAZoAB0FXABOBmYAOQVOADkCJQCgBD0AcwRe
+ ACkDlgBLBR0ASAMEAKgDtgBqAyUBDgNO/9EFCgA5AnsA6QUXADkFSgA5BdEAIwW6/8UFiQA5
+ BRcAOQUnAF4FIQA5A64BYgOWAJ4EywA5BO4AUQS2ACMEBABOBs0AOQUpACMGdQCkBUoAOQXT
+ AIcFvgDTBOUA9gXnADkFUABUAlwA9QQl/8kFqgB/BIcApgZSANEFvADWBVYAOQVkAE4GWgA5
+ BOEAdwXfAE4Esv/+BaYA2QTVADUHxQA6BJwAOwVoAB0GugAKBOEA2wQfAAgEwwCoA1wABwSy
+ ACYEWgDGBR8ANQTsAGwEQgA1BWIANQRaADUDJQAXBE4AJQSkAMQCGwCmAkz/KwPpAKQCHwDN
+ BpwApQTJAM0ErAA1BbgAzAWBACkE1QC/BFQASAMXAAIEewDNA3MAHAXVABwDmAA0A+P/lASJ
+ ABsERgCBAhIA2QReAEME5QBNBc8ACgMEAKgDJf91As0AbQlvAQIC3QAIAt0ACARaARQJZAA5
+ Bd8ATgNOADkJfQA5BroACgJgAEoCAgApAwQAKQMxABcDwwBQBPAAaga2AGoEWgB0BjUADgRU
+ AEgDeQBMB7IANQSJABsFaAAdA5oAAAMfARMEQgA1BZ4ACgSsAH4FaAAdAhIA1gPTAEIEWgEC
+ BfYALQONADkExQA5BO4AsAO2AGoF9gAtBFoAmAQfADkFHQBEA4kAJwOeADkEWgE4BR8AzATb
+ AEwDrgFoBEIAYgIbAKoDWgBCBRIASgZ/AIEGfwCBB8cAOQQEAE4FKQAjBSkAIwUpACMFKQAj
+ BSkAIwUpACMH7AAjBUoAOQW+ANMFvgDTBb4A0wW+ANMCXP/ZAlwADgJc/+4CXAARBdMAHwW8
+ ANYFVgA5BVYAOQVWADkFVgA5BVYAOQO8AEwFVgA5BaYA2QWmANkFpgDZBaYA2QVoAB0FZABO
+ BXcAxwUfADUFHwA1BR8ANQUfADUFHwA1BR8ANQcxAAwEQgA1BFoANQRaADUEWgA1BFoANQIb
+ /7kCG//tAhv/yQIb//EErAA1BMkAwgSsADUErAA1BKwANQSsADUErAA1BDMAIwSsADUEewBx
+ BHsAzQR7AM0EewDNA+P/lAW4ANMD4/+UAhsAxASH/+gCH/+iBFoA+wRaAI0EWgGyBFoBMQRa
+ AoEEWgEsBSkAbwS8//oEH//4AC/+KwSsADUFb//+BWQAeQTwAGoFfwAbBagANQJM/ysE5QA+
+ BO4AUQTLACYEtgAjA3MAYAU/ABcFRAAXBFoBXgUpACMFHwA1BSkAIwUfADUFKQAjBR8ANQVK
+ ADkEQgA1BUoAOQRCADUFSgA5BEIANQVKADkEQgA1BdMAhwZaADUF0wAfBWIANQW+ANMEWgA1
+ Bb4A0wRaADUFvgDTBFoANQW+ANMEWgA1Bb4A0wRaADUF5wA5BE4AJQXnADkETgAlBecAOQRO
+ ACUF5wA5BE4AJQVQAFQEpADEBVAAOgSk/7cCXP+qAhv/VgJc/7wCG/+VAlz/kgIb/3ECXP/w
+ Ahv/tgJcAMMGgQD1BGYApgQl/8kCTP8rBaoAfwPpAKQD6QCkBIcApgIf/+8EhwCmAh8AfQSH
+ AKYDBgDNBIcApgNQAM0FvADWBMkAzQW8ANYEyQDNBbwA1gTJAM0EyQB2BbwA1gTJAM0FVgA5
+ BKwANQVWADkErAA1BVYAOQSsADUE4QB3BNUAvwThAHcE1QC/BOEAdwTVAL8F3wBOBFQASAXf
+ AE4EVABIBd8ATgRUAEgEsv/+AxcAAgSy//4DagACBLL//gMXAAIFpgDOBHsAhAWmANkEewDD
+ BaYA2QR7AJ8FpgDZBHsAzQWmANkEewDNBaYA2QR7AM0HxQA6BdUAHAVoAB0D4/+UBroACgSJ
+ ABsGugAKBIkAGwLLABcH7AAjBzEADAVWADkErAA1Bd8ATgRUAEgEsv/+AxcAAgO2AGoGdQCk
+ BOwAbAXTAIcHxQA6B8UAOgViADUFaAAdBOUA9gMlABcGUgDRBpwApQVkAE4F1QAcBbgAzAXV
+ ABwF3wBOA+P/lAfFADoF1QAcBFQASASy//4DFwACAs0AbQMfAO4AAAGOAQEBAQFEOwE7AUwB
+ ATsBAQEBAQFMAUwBATsBAQEBAQErTAFMAUwBAUw7AQEBATcBAQEBTAEBOwEBAQEBAQEvAQEB
+ NwEBTAEBRAEBAQEBRAEBAQEmKwEBAQEBAQEBATcBATsBAUwBAQE7AQEBAQFEATMBAQEBHAEB
+ KwEBAQEBAQEBATsBFAEBRAEUAQEBO0wBTEwBAQEBAQEBAS8BAQEBAS8BAQEBAQEBAQEBTAEB
+ AQEBAQEBAQEBAQEBRAEBAQEBATdEAQEBAQEBAQEBAQEBAQEBAQEBAQEBASYBAQEBAQEBAQEB
+ AQEBAQEBAQEBAQEBAQEBRAEBAQEBAQEBNwEBAQEBAQEBAQEBTAEBAQEBAQFMAQEBAQEBAQEB
+ AQEBOyYBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBTAEBAQEBAQEBAQEBAQEBAQEB
+ RA0BAQEBAQEBAQEBAQEBAQEBOzsBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB
+ AQEBAQEBAQEAAAAAAAEAAQEBAQEADAD4CP8ACAAH//4ACQAI//0ACgAI//0ACwAJ//0ADAAK
+ //0ADQAL//wADgAM//wADwAM//wAEAAN//wAEQAO//sAEgAP//sAEwAQ//sAFAAQ//sAFQAR
+ //oAFgAS//oAFwAT//oAGAAU//oAGQAU//kAGgAV//kAGwAW//kAHAAX//kAHQAY//gAHgAY
+ //gAHwAZ//gAIAAa//gAIQAb//cAIgAc//cAIwAc//cAJAAd//cAJQAe//YAJgAf//YAJwAg
+ //YAKAAg//YAKQAh//UAKgAi//UAKwAj//UALAAk//UALQAk//QALgAl//QALwAm//QAMAAn
+ //QAMQAo//MAMgAo//MAMwAp//MANAAq//MANQAr//IANgAs//IANwAs//IAOAAt//IAOQAu
+ //EAOgAv//EAOwAw//EAPAAw//EAPQAx//AAPgAy//AAPwAz//AAQAA0//AAQQA0/+8AQgA1
+ /+8AQwA2/+8ARAA3/+8ARQA4/+4ARgA4/+4ARwA5/+4ASAA6/+4ASQA7/+0ASgA8/+0ASwA8
+ /+0ATAA9/+0ATQA+/+wATgA//+wATwBA/+wAUABA/+wAUQBB/+sAUgBC/+sAUwBD/+sAVABE
+ /+sAVQBE/+oAVgBF/+oAVwBG/+oAWABH/+oAWQBI/+kAWgBI/+kAWwBJ/+kAXABK/+kAXQBL
+ /+gAXgBM/+gAXwBM/+gAYABN/+gAYQBO/+cAYgBP/+cAYwBQ/+cAZABQ/+cAZQBR/+YAZgBS
+ /+YAZwBT/+YAaABU/+YAaQBU/+UAagBV/+UAawBW/+UAbABX/+UAbQBY/+QAbgBY/+QAbwBZ
+ /+QAcABa/+QAcQBb/+MAcgBc/+MAcwBc/+MAdABd/+MAdQBe/+IAdgBf/+IAdwBg/+IAeABg
+ /+IAeQBh/+EAegBi/+EAewBj/+EAfABk/+EAfQBk/+AAfgBl/+AAfwBm/+AAgABn/+AAgQBo
+ /98AggBo/98AgwBp/98AhABq/98AhQBr/94AhgBs/94AhwBs/94AiABt/94AiQBu/90AigBv
+ /90AiwBw/90AjABw/90AjQBx/9wAjgBy/9wAjwBz/9wAkAB0/9wAkQB0/9sAkgB1/9sAkwB2
+ /9sAlAB3/9sAlQB4/9oAlgB4/9oAlwB5/9oAmAB6/9oAmQB7/9kAmgB8/9kAmwB8/9kAnAB9
+ /9kAnQB+/9gAngB//9gAnwCA/9gAoACA/9gAoQCB/9cAogCC/9cAowCD/9cApACE/9cApQCE
+ /9YApgCF/9YApwCG/9YAqACH/9YAqQCI/9UAqgCI/9UAqwCJ/9UArACK/9UArQCL/9QArgCM
+ /9QArwCM/9QAsACN/9QAsQCO/9MAsgCP/9MAswCQ/9MAtACQ/9MAtQCR/9IAtgCS/9IAtwCT
+ /9IAuACU/9IAuQCU/9EAugCV/9EAuwCW/9EAvACX/9EAvQCY/9AAvgCY/9AAvwCZ/9AAwACa
+ /9AAwQCb/88AwgCc/88AwwCc/88AxACd/88AxQCe/84AxgCf/84AxwCg/84AyACg/84AyQCh
+ /80AygCi/80AywCj/80AzACk/80AzQCk/8wAzgCl/8wAzwCm/8wA0ACn/8wA0QCo/8sA0gCo
+ /8sA0wCp/8sA1ACq/8sA1QCr/8oA1gCs/8oA1wCs/8oA2ACt/8oA2QCu/8kA2gCv/8kA2wCw
+ /8kA3ACw/8kA3QCx/8gA3gCy/8gA3wCz/8gA4AC0/8gA4QC0/8cA4gC1/8cA4wC2/8cA5AC3
+ /8cA5QC4/8YA5gC4/8YA5wC5/8YA6AC6/8YA6QC7/8UA6gC8/8UA6wC8/8UA7AC9/8UA7QC+
+ /8QA7gC//8QA7wDA/8QA8ADA/8QA8QDB/8MA8gDC/8MA8wDD/8MA9ADE/8MA9QDE/8IA9gDF
+ /8IA9wDG/8IA+ADH/8IA+QDI/8EA+gDI/8EA+wDJ/8EA/ADK/8EA/QDL/8AA/gDM/8AA/wDM
+ /8AAAAAXAAABkAkLBAAEBAcHCAYDBQYEBgQEBAQGAwYHBwYGBgcGBAQFBgUFCQYIBggGBgcG
+ AwUGBQcGBgYHBgcFBwUJBQYIBQUGBAUFBgYFBgUEBQUCAwQCCAUFBgYHBgMFBAcEBAUFAgUG
+ BwQEAwoDAwULBwQLCAMDAwQEBggFBwUECgUGBAQFBgUGAgUFCAQFBgQIBQUGBQUFBgYEBQIE
+ BgcHCQUGBgYGBgYJBgYGBgYDAwMDCAYGBgYGBgQGBgYGBgYGBwYGBgYGBgkFBQUFBQICAgIF
+ BQUFBQUFBQUFBQUFBAgEAgUCBQUFBQUFBgUFAAUGBgYGBgMGBgUFBQYGBQYGBgYGBgYFBgUG
+ BQYFBwcHBgYFBgUGBQYGBgUHBQcFBwUHBQYFBgYDAgMCAwIDAgMHBQUDBgQEBQIFAgUDBQQG
+ BQYFBgUFBwUGBQYFBgUFBQUFBQUHBQcFCAUFAwUEBQMGBQYFBgUGBQYFBwUJBwYECAUIBQMJ
+ CAYFBwUFAwQHBgcJCQYGBgQHBwYHBgcHBAkHBQUDAwQKDQUABQUICAkHAwUGBAYEBQQEBgMG
+ BwcIBwYIBgUEBgYGBgoGCQcIBwYHBwMFBwYIBwcHCAcHBggGCgYHCAYFBgQGBQYGBQcFBAYG
+ AwMFAwkGBgcHBwYEBgQHBQUGBQMFBgcEBAQLBAQFDQcEDAgDAwQFBQYIBQgFBAsGBwUEBQcG
+ BwMGBQkEBgcFCQUFBgUFBQcGBQUDBAYICAoGBgYGBgYGCgcHBwcHAwMDAwgHBwcHBwcFBwcH
+ BwcHBwgGBgYGBgYKBgUFBQUDAwMDBgYGBgYGBgUGBgYGBgUIBQMGAwUFBQUFBQYGBQAGBwcG
+ BwcDBgYGBgUHBwUGBgYGBgYHBQcFBwUHBQcIBwcHBQcFBwUHBwcFBwUHBQcFBwUHBgcGAwMD
+ AwMDAwMDCAYFAwcFBQYDBgMGBAYEBwYHBgcGBgcGBwYHBgcGBgYGBgYGBwUHBQgFBgQGBAYE
+ BwYHBgcGBwYHBggGCgcHBQgGCAYDCgkHBgcFBgQFCAYHCgoHBwYECAgHBwcHBwUKBwUGBAQE
+ Cw4FAAUFCQgKBwMGBgUHBAUEBQcDBwgICAgHCAcFBQcHBgYKBwoHCQgHCAcDBggGCAgHBwkH
+ CAYIBwsGBwkHBgYFBgYHBwYIBgQGBgMDBQMJBwYICAgHBAYFCAUFBgYDBgcIBAQEDAQEBg4I
+ BQ0JAwQEBQUHCQYJBgUMBgcFBAYIBgcDBgYJBQcHBQkGBgcFBgYHBwUGAwUHCQkLBgcHBwcH
+ CAsHCAgICAMDAwMJCAcHBwcHBQcICAgIBwcIBwcHBwcHCwYGBgYGAwMDAwYHBgYGBgYGBgYG
+ BgYFCQUDBgMGBgYGBgYHBwYABgcHBwgIAwcHBwYFBwcGBwcHBwcHBwYHBgcGBwYICQgICAYI
+ BggGCAcIBggGCAYIBggGBwYHBwMDAwMDAwMDAwkGBgMIBQUGAwYDBgQGBQgHCAcIBwcIBwcG
+ BwYHBgcHBwcHBwgGCAYJBgYEBgUGBAgGCAYIBggGCAYIBgsIBwUJBgkGBAsKBwYIBgYEBQkH
+ CAsLBwcHBAkJBwgICAgFCwgGBgQEBAwPBQAFBQoJCggDBgcFCAUGBQUIBAgICQkICAkIBgUH
+ BwcHCwgLCAoJBwkJBAYJBwkJCAgKCAkHCQcMBwgKBwYHBQcHBwcGCAcFBgcDAwYDCgcHCQgI
+ BwUHBQkFBgcGAwYHCQUFBA8EBAcPCQUOCgQEBQYGBwoHCQcFDQcIBQUGCAcIAwYHCgUHCAYK
+ BwYIBgYHCAcGBgMFCAoKDAcICAgICAgMCAkJCQkEBAQECgkICAgICAYICAgICAgICQgICAgI
+ CAwGBwcHBwMDAwMHBwcHBwcHBgcHBwcHBgoGAwcDBwcHBwcHCAcGAAcICAcICAMHBwcHBggI
+ BwgICAgIBwgGCAYIBggGCQoJCAkHCQcJBwkICQcJBgkGCQYJBggHCQcEAwQDBAMEAwQKBwYD
+ CQYGBwMHAwcFBwUJBwkHCQcHCAcIBwgHCAcHBwcHBwcJBwkHCgYHBQcFBwUIBwgHCAcIBwgH
+ CQcMCQgGCgcKBwQMCwgHCQcHBQYKBwkMDAgIBwUJCggJCQkJBgwJBwcFBAUNEAYABgYKCQsJ
+ AwcHBggFBgUFCAQICQkKCQgJCAYGCAgIBwwICwkKCQgJCQQHCQcLCQkJCggKCAkIDQcJCwgH
+ CAUIBwkIBwkHBQcIAwQGAwsICAkJCQgFBwYJBgYHBwMICAkFBQUQBQUHEAoFDwsEBAUGBggL
+ BwoHBg4HCQYFBwkICQMHBwsGCAgGCwcHCAYGBwgIBgcDBQgLCw0HCAgICAgJDQkJCQkJBAQE
+ BAoJCQkJCQkGCQkJCQkJCQoICAgICAgNBwcHBwcDAwMDCAgICAgICAcIBwcHBwYKBgMHAwcH
+ BwcHBwgIBwAICQkICQkECAgICAYJCQcICAgICAkJBwkHCQcJBwkKCQkJBwkHCQcJCAkHCgcK
+ BwoHCgcJCAkHBAMEAwQDBAMECwcHBAkGBgcDBwMHBQcFCQgJCAkICAoICQgJCAkICAgICAgI
+ CgcKBwoHCAUIBggFCQcJBwkHCQcJBwkHDQkJBgsHCwcFDQwJCAoHCAUGCwgJDQ0JCQgFCgsJ
+ CQkJCgYNCQcIBQUFDxIHAAcHDAsNCgQICAcKBQcGBgkFCgoLCwoKCgoHBwkJCQgOCg0KDAsJ
+ CwoECAsIDAsKCgwJCwkLCQ8JCg0JCAkGCQgKCQgLCAYICQQEBwQMCQkLCgoJBggGCwcHCQgE
+ CAkLBQYFEgUFCBILBhINBAQGBwcJDQgLCAcPCQoHBggLCQoECAgMBwkJBwwICAoHBwgJCgcI
+ BAYKDAwPCAoKCgoKCg8KCwsLCwQEBAQMCwoKCgoKBwoLCwsLCgoLCgoKCgoKDggICAgIBAQE
+ BAkJCQkJCQkICQgICAgHDAcECAQICAgICAgKCQgACQoKCQoLBAkJCQkHCgoICgoKCgoKCggK
+ CAoICggLDAsLCwgLCAsICwkLCAsICwgLCAsICgkKCQQEBAQEBAQEBAwICAQLBwcIBAgECAYI
+ BgsJCwkLCQkLCQoJCgkKCQkJCQkJCQsICwgMCAkGCQYJBgsICwgLCAsICwgLCQ8LCgcNCQ0J
+ BQ8NCgkLCAkGBwwJCw8PCgoJBgwMCgsLCwsHDwsICQYFBhATBwAHBw0LDQsECAkHCgYHBgcK
+ BQoLDAsLCgsKBwcKCgkJDgoOCwwLCgwLBQgLCQ0LCwsNCgwJDAoQCQsNCggKBwkJCgoJCwkG
+ CAkEBQgEDgoJCwsKCQYJBwwHCAkJBAkKDAYGBhMGBgkTDAcTDQUFBgcICg0JDAkHEAkLBwYJ
+ CwkLBAgJDQcKCgcNCQgKBwgJCgoHCQQHCg0NEAgKCgoKCgoQCwsLCwsFBQUFDAsLCwsLCwcL
+ CwsLCwsLCwoKCgoKCg8JCQkJCQQEBAQJCgkJCQkJCAkJCQkJCAwIBAkECQkJCQkJCgkIAAkL
+ CwoLCwUKCgoJBwsLCQoKCgoKCgsJCwkLCQsJDA0MCwsJCwkLCQsKCwkMCQwJDAkMCQsJCwoF
+ BAUEBQQFBAUNCQgFCwgICQQJBAkGCQcLCgsKCwoKDAoLCQsJCwkKCgoKCgoMCQwJDAkJBgkH
+ CQYLCQsJCwkLCQsJDAkQDAsIDQkNCQYQDgsJDAkJBgcNCgwQEAsLCgYNDQsMCwwMCBAMCQkG
+ BgYRFAgACAgODA4LBAkJCAsHCAcHCwULCwwNDAsLCwgICgoKCQ8LDgsNDAoNCwUJDAoNDAsL
+ DgsMCgwKEQoLDgoJCgcKCQsKCQwJBwgKBAUIBQ4KCgwMCwoHCgcMCAgKCQQJCgwHBwYUBgYJ
+ FAwHFA4FBQYHCAsOCQ4JBxEKCwgHCQwKCwQJCQ0ICgoIDQkJCwcICQoLCAkEBwsODhEJCwsL
+ CwsLEQsMDAwMBQUFBQ0MCwsLCwsICwwMDAwLCwwLCwsLCwsQCgkJCQkEBAQECgoKCgoKCgkK
+ CgoKCggNCAQKBQkJCQkJCQsKCQAKDAsLDAwFCgoKCgcLCwkLCwsLCwsLCQsJCwkLCQwODAwM
+ CQwJDAkMCgwJDQkNCQ0JDQkLCgsKBQQFBAUEBQQFDgkJBQwICAoFCgUKBgoHDAoMCgwKCgwK
+ CwoLCgsKCgoKCgoKDAkMCQ0JCgcKBwoHDAoMCgwKDAoMCgwKEQwLCA4KDgoGEQ8LCgwJCgcI
+ DgoMERELCwoHDQ4LDAwMDAgRDAkKBwYHExcJAAkJDw0QDQUKCgkMBwkHCAwGDAwODg0MDAwJ
+ CQsMCwoRDBANDg4MDgwGCg0LDw4NDQ8MDgsNCxILDRAMCgsICwoMDAoNCgcKCwUFCQUQCwsO
+ DQwLBwsIDgkJCwoFCgwOBwcHFwcHChYOCBcQBgUHCAkMEAoPCggTCw0JBwoNCw0FCQoPCAsL
+ CQ8KCgwICQoMCwkKBQgMDw8SCgwMDAwMDRMNDg4ODgYGBgYODg0NDQ0NCQ0NDQ0NDQ0NDAwM
+ DAwMEgoKCgoKBQUFBQsLCwsLCwsKCwsLCwsJDgkFCwUKCgoKCgoMCwoACw0NDA0NBQwMCwsI
+ DA0KDAwMDAwMDQoNCg0KDQoODw4NDgoOCg4KDgsOCg4KDgoOCg4KDQsMCwYFBgUGBQYFBg8K
+ CgUNCQkLBQsFCwcLCA4LDgsOCwsNCw0LDQsNCwwLDAsMCw4KDgoOCgsHCwgLBw0LDQsNCw0L
+ DQsNCxIODQkQCxALBxMRDQsOCgsHCQ8MDhISDQ0MBw8QDQ4ODg4JEg4KCwcHBxUZCQAJCREO
+ EQ4GCwsJDQgKCAkNBw0ODw8PDQ0NCgkNDQwLEg4RDhAPDQ8OBgsPDBEPDg4RDQ8MDw0UDA4S
+ DQsNCQwLDQ0LDgsICwwGBgoGEQ0MDw4NDAgMCQ8JCgwLBQwNDwgIBxkICAsZDwkZEgYGCAkK
+ DRILEAsJFQwOCQgLDwwOBQoLEAkNDQoQCwsNCQoLDQwKCwYJDRERFAsODg4ODg4VDg8PDw8G
+ BgYGEA8ODg4ODgoODw8PDw4ODw0NDQ0NDRQLCwsLCwYGBgYMDQwMDAwMCwwMDAwMChAKBgwG
+ CwsLCwsLDgwLAAwODg0ODwYNDQ0MCQ4OCw4NDg0ODQ4LDgsOCw4LDxEPDg8LDwsPCw8MDwsQ
+ CxALEAsQCw4MDgwGBgYGBgYGBgYRDAsGDwoKDAYMBgwIDAkPDQ8NDw0NDw0ODA4MDgwNDQ0N
+ DQ0PCw8LEAsMCAwJDAgPDA8MDwwPDA8MDwwUDw4KEgwSDAcVEw4MDwsMCAoRDQ8UFA4ODQgR
+ EQ4PDw8PChQPCwwIBwgYHAsACwsTEBMQBg0NCw8JCwkKDwcPEBEREQ8PDwsLDg8ODBUPFBAS
+ EQ8SEAcMEQ4TERAQEw4SDhEPFw4QFA8MDgoODQ8PDRANCQ0OBgcMBhMODhERDw0JDQoSCwwO
+ DQYNDxEJCQgcCQkNHBIKHBQHBgkKCw8UDRINChgOEAsJDREOEAYLDRILDg8LEg0MDwsLDQ8P
+ Cw0GCg8TExcMDw8PDw8PGBARERERBwcHBxIREBAQEBALEBEREREQEBAPDw8PDw8WDA0NDQ0G
+ BgYGDg4ODg4ODg0ODQ0NDQwSDAYOBg0NDQ0NDQ8ODAEOEBAPEBEHDw8ODgoQEA0PDw8PDw8Q
+ DRANEA0QDRETERARDRENEQ0RDhENEg0SDRINEg0QDhANBwYHBgcGBwYHFA0MBxEMDA4GDgYO
+ CQ4KEQ4RDhEODhEOEA4QDhAODw8PDw8PEg0SDRINDgkOCg4JEQ0RDRENEQ0RDRENFxIQDBQO
+ FA4IGBYQDhINDgkLEw8RFxcQEA8JExQQEhESEgwXEg0OCQgJGyAMAAwMFhIWEgcODwwRCg0L
+ CxEIERIUExMREREMDBAREA0XERYSFBMRFBEIDhMPFBMSEhURFBATEBoQEhcQDhALEA8REQ4S
+ DwsOEAcIDQcWEBATExEPCg8MFAwNDw4HDhEUCgsJIAoKDx8UCyAXCAcKCw0RFw8UDwwaDxIM
+ Cw4TEBIHDQ8UDBARDRQPDhEMDA8SEAwOBwsRFhYaDREREREREhsSExMTEwgICAgUExISEhIS
+ DRITExMTEhISERERERERGQ8PDw8PBwcHBxAQEBAQEBAOEA8PDw8NFA0HDwcPDw8PDw8REA4B
+ EBISERMTCBEREBALEhIPEREREREREg4SDhIOEg4UFRQSEw8TDxMPEw8TDxQPFA8UDxQPEhAR
+ EAgHCAcIBwgHCBYPDggTDQ0PBw8HDwoPCxMQExATEBATEBIQEhASEBAQEBAQEBQPFA8UDxAK
+ EAwQChMPEw8TDxMPEw8TDxoUEg0XDxcPCRsYEhAUDxAKDRYRFBoaEhIRCxUWEhQTFBQNGhQP
+ EAoJCx0iDQANDRcUGBMIDxANEwsNCwwSCRITFRUUEhITDQ0REhEPGRMYExYVEhUUCQ8VEBYV
+ ExQXEhURFRIcERQYEg8RDBEQEhIPFBALDxEICA4IGBERFRQSEAsQDRUNDhAPCBESFQsLCiIK
+ ChAiFQwiGAkICwwOEhgQFxANHRAUDQsPFBEUCA4QFg0REg0WEA8TDQ0QExINDwgMEhgYHA8T
+ ExMTExMdExUVFRUJCQkJFhUTExMTEw4TFBQUFBQUFBMTExMTExsQEBAQEAgICAgRERERERER
+ DxEQEBAQDhUOCBAIEBAQEBAQExEPAREUFBIUFQgSEhERDBMTEBMTExMTEhMPEw8TDxMPFRcV
+ FBUQFRAVEBURFRAVEBUQFRAVEBMRFBEJCAkICQgJCAkYEA8IFQ4OEAgQCBALEAwVERURFRER
+ FBETERMRExESEhISEhIVEBUQFhARCxEMEQsUEBQQFBAUEBQQFREcFRQOGBAYEAodGhMRFRAR
+ Cw0XEhUcHBQUEgsXGBQVFRUVDhwVEBELCgsgJg4ADg4aFRoVCRERDhQMDw0NFAoUFRcXFhQT
+ FQ8OExQTEBwVGhUYFxQYFQkRFxIZFxUWGRQXExcTHxIWGxQQEw0TERUUERYRDRETCAkQCBoT
+ ExcWFBEMEg4XDhASEQgSFBcMDQslCwsRJRcNJhsKCAwNDxQbERkRDiASFg4MERYTFggPERgO
+ ExQPGBEQFA4OERUTDxEIDRQaGh8QFRUVFRUUIBUXFxcXCQkJCRgXFRUVFRUPFRcXFxcWFhYU
+ FBQUFBQeEREREREICAgIExMTExMTExETEhISEhAXEAgSCBERERERERUTEAETFhYUFhcJFBQT
+ Ew4VFREVFBUUFRUVERURFREVERcZFxYXERcRFxEXEhcRGBEYERgRGBEVExUTCQgJCAkICQgJ
+ GhIRCRcQEBIIEggSDBINFxMXExcTExcTFRMVExUTFBMUExQTFxEXERgREwwTDhMMFxIXEhcS
+ FxIXEhcSHxcWEBsSGxILIB0VExcREwwPGhQXHx8WFhQNGRoWFxcXFxAfFxETDAsMIScPAA8P
+ GhYaFgkREg8VDQ8NDhUKFRYYGBcVFBUPDxQUExEcFRsWGBgUGRYKERcTGhgWFhoVGBMXFCAT
+ FhwUERQOExIVFBIWEg0SEwkJEAkbFBMYFxQSDRIOGA8QExIJEhQYDQ0MJgwMEiYYDiccCggM
+ DRAUHBIaEg4gExYPDRIXExYJEBIZDxQUDxkSERUODxIVFA8SCQ4VGxsgEBUVFRUVFiEWGBgY
+ GAoKCgoYGBYWFhYWDxYXFxcXFhYXFRUVFRUVHhISEhISCQkJCRMUExMTExMRExISEhIQGBAJ
+ EwkSEhISEhIVFBEBExYWFBcXCRQUFBMOFhYSFRUVFRUVFhIWEhYSFhIYGhgWGBIYEhgSGBMY
+ EhgSGBIYEhgSFhMWEwoJCgkKCQoJChsSEQkXEBATCRMJEwwTDhgUGBQYFBQYFBYTFhMWExQU
+ FBQUFBgSGBIYEhMNEw4TDRcSFxIXEhcSFxIXEiAYFhAcExwTDCEeFhMYEhMNDxsUGCAgFhYU
+ DRobFhgYGBgQIBgSEw0MDSUsEQARER4YHRkKFBQRGA4RDw8XCxgZGxsaGBYYEREWFxYSIBge
+ GBsbFxsZCxMaFRwbGRkdFxsWGhYkFRkfFxMWEBYUFxcUGRQPFBUKCxIKHxYWGhkXFA4VEBsR
+ EhUUChUXGw4PDSwNDRQsGw8sHwsJDg8RFx8UHRQQJBUZEQ4UGhYZChIUHBAWFhEcFBMYEREU
+ FxcRFAoQFx4eJBIYGBgYGBglGBsbGxsLCwsLGxsZGRkZGREZGhoaGhkZGRgYGBgYGCIUFBQU
+ FAoKCgoWFhYWFhYWExYVFRUVEhsSChUKFBQUFBQUGBYTARYZGRcZGgsXFxYWEBgYFBgYGBgY
+ FxgUGBQYFBgUGx0bGRsUGxQbFBsVGxQbFBsUGxQbFBkVGRYLCgsKCwoLCgseFBMLGhISFQoV
+ ChUOFQ8bFhsWGxYWGhYZFhkWGRYXFhcWFxYbFBsUGxQWDhYQFg4aFRoVGhUaFRoVGhUkGxkS
+ HxUfFQ0lIRkWGxQWDhEeFxskJBkZFw8dHxkbGhsbEiQbFBYODQ4qMhMAExMiHCEcDBYXExsQ
+ ExERGg0bHB8eHRsbGxMTGRoZFiQbIhweHhofGwwWHhghHhwcIRkfGR0ZKRgcIxoWGRIZFxsa
+ FhwXERcYCwwVCyIZGR4dGRYQGBIfExQYFgsXGh8QEQ8yDw8XMR8RMiMMCxAQFBojFyEXEikY
+ HBMQFh0ZHAsUFx8TGRoTHxcWGxITFxsZExYLEhsiIikVGxsbGxsbKhweHh4eDAwMDB4eHBwc
+ HBwUHB4eHh4cHBwbGxsbGxsmFhcXFxcLCwsLGRkZGRkZGRYZGBgYGBQeFAsYCxcXFxcXFxsZ
+ FgEZHRwaHR4MGhoZGRIcHBcbGxsbGxscFhwWHBYcFh8hHxweFx4XHhceFx4XHxcfFx8XHxcc
+ GBsYDAsMCwwLDAsMIhcWDB4VFRgLGAsYEBgRHhkeGR4ZGR4ZHBkcGRwZGhkaGRoZHxcfFx8X
+ GRAZEhkQHhgeGB4YHhgeGB0XKR8cFCMYIxgPKiYcGR8XGRATIhofKSkcHBoRISMcHx4fHxQp
+ HxcZEA8QLjcVABUVJR8lHw0YGRUdERUSEx0OHR4hISAdHR0VFRwcGxcnHiUeISEcIh8OGCEa
+ JCEfHyUcIhshHC0bHyccGBwTGxkdHBgfGRIZGwwNFgwnHBshIBwZEhoUIhUWGhkMGhwhERIQ
+ NhAQGTYiEzcnDgwREhYcJxkkGRQsGh8VEhggGx8MFhkiFBscFSIZGB0UFRkeHBUYDBMdJSUt
+ GB4eHh4eHS4eISEhIQ4ODg4hIR8fHx8fFR8gICAgHx8gHR0dHR0dKhgZGRkZDAwMDBscGxsb
+ GxsYGxoaGhoWIRYMGgwZGRkZGRkeGxgBGx8fHCAhDRwcHBsUHh4ZHh0eHR4dHhgeGB4YHhgh
+ JSEfIRkhGSEZIRkhGSIZIhkiGSIZHxsfGw4MDgwODA4MDiUZGA0hFhYaDBoMGhEaEyEcIRwh
+ HBwiHB8bHxsfGxwcHBwcHCIZIhkiGRsSGxQbEiAaIBogGiAaIBohGi0iHxYnGicaEC4pHxsi
+ GRsSFSUcIS0tHx8cEiQmHyIhIiIWLSIZGxIQEjI7FwAXFygiKCENGhsWIBMXFBUgECAhJCQj
+ IB8gFxYeHx0ZKiAoISQkHyUhDxojHCckISIoHyUdIx4xHSIqHxoeFR0bIB8bIRsUGx0NDhgN
+ Kh4dJCIeGxMcFiQWGBwbDRsfJBMUEjsSEhs7JRU7Kg8NExMYHyobJxsWMBwiFxQbIx0iDRgb
+ JRYeHhclGxogFhYbIB4XGw0VICkpMRkgICAgICAyISQkJCQPDw8PJCQhISEhIRchIyMjIyIi
+ IiAgICAgIC0bGxsbGw0NDQ0dHh0dHR0dGh0cHBwcGCQYDRwNGxsbGxsbIB4aAR0iIh8iIw4f
+ Hx4dFiEhGyAgICAgICEbIRshGyEbJCgkISQbJBskGyQbJBslGyUbJRslGyEdIR0PDQ8NDw0P
+ DQ8pGxoOIxgYHA0cDRwTHBUkHiQeJB4eJB4hHSEdIR0fHh8eHx4lGyUbJRsdEx0VHRMjHCMc
+ IxwjHCMcIxwxJCIYKhwqHBEyLSEdJRsdExcoHyQxMSIiHxQoKSIkJCQlGDEkGx0TEhQ2QBgA
+ GBgrJCwkDh0eGCMUGRUWIhEiJCcnJSIiIxkYICEgGy4jLCQoJyEoJBAcJh8qJyQkKyEoICYh
+ NB8lLSEcIBcgHSIhHSQdFR0fDhAaDiwgICclIR0VHhcnGBofHQ4eIScUFRM/ExMdPygWQC0Q
+ DRQWGSEtHSodFzQfJRgVHSYgJQ4ZHSgYICEZKB0cIxgYHSIhGR0OFyIsLDUbIyMjIyMjNSQn
+ JycnEBAQECgnJCQkJCQZJCYmJiYlJCUjIyMjIyMwHB0dHR0ODg4OICAgICAgIBwgHh4eHhon
+ Gg4fDh0dHR0dHSMgHAEgJSQhJSYQISEgIBcjJB0jIyMjIyIkHSQdJB0kHScrJyQnHScdJx0n
+ HScdKB0oHSgdKB0kHyQfEA4QDhAOEA4QLB4cECYaGh8OHw4fFB8WJyAnICcgICYgJCAkICQg
+ ISEhISEhKB0oHSgdIBUgFyAVJh4mHiYeJh4mHiYdNCclGi0fLR8TNTEkICgdIBUZLCEnNDQk
+ JSEVKy0kJycnKBo0Jx0gFRMVOkUaABoaLicvJg8fHxolFRsXGCUSJSYqKiglJCUbGiMkIh0y
+ JS8mKyojKyYRHikhLionJy4jKyInIzghJzEjHiMYIiAlJB8nIBcfIg8RHA8wIyIpKCMfFiAZ
+ KhocIR8PICMqFRcURBUVIEMrGEUxEQ8WFxskMSAtHxk4IScaFx8pIicPGyArGiMkGysgHiUZ
+ GyAlIxsfDxglLy84HSUlJSUlJTkmKioqKhERERErKicnJycnGycpKSkpJycoJSUlJSUlNCAg
+ ICAgDw8PDyIjIiIiIiIeIiAgICAcKRwPIQ8gICAgICAlIh4BIicnJCgpESMkIyIZJiYgJSUl
+ JSUlJh8mHyYfJh8qLionKiAqICogKiAqICsfKx8rHysfJyImIhEPEQ8RDxEPES8gHhEpHBwh
+ DyEPIRYhGCojKiMqIyMpIyciJyInIiMjIyMjIysfKx8rHyIWIhkiFikgKSApICkgKSAnITgq
+ JxwxITEhFDk0JyIrHyIWGy8kKjg4JycjFy4wJyopKiscOCofIhYUF0NPHgAeHjYuNiwSJCUe
+ KxkfGhwqFSssMTAuKysrHx4oKSciOSs2LDEwKTItFCMvJjUwLS01KTEnLyhBJy04KSMoHCck
+ KykkLSQaJScSEyESOCgnMC4oJBomHTEeISYkESUpMRkaF08YGCRPMRxPOBQQGRsgKTgkNCQd
+ QCYtHhokLyctESAkMh4oKh8yJCMrHh4kKykfJBIcKjY2QSIrKysrKytCLDAwMDAUFBQUMTAt
+ LS0tLR8tLy8vLy0tLSsrKysrKzwjJCQkJBISEhInKCcnJycnIycmJiYmITAhEiYSJCQkJCQk
+ KygjAicuLSkuLxMpKSgnHCwsJCsrKysrKywkLCQsJCwkMTUxLTAkMCQwJDAkMCQxJDEkMSQx
+ JC0nLScUEhQSFBIUEhQ2JSMTLyEhJhImEiYZJhwwKDAoMCgoMCgtJy0nLScpKCkoKSgxJDEk
+ MiQnGicdJxovJi8mLyYvJi8mLyZBMS0hOCY4JhdCPC0nMSQnGh82KTFBQS0tKRo1Ny0xMDEx
+ IUExJCcaFxpLWSIAIiI8MjwyFCgoIjAcIx0fLxcwMTc1NDAwMCMiLS4sJj8wPDI2Ni44MhYn
+ NSo7NjIzPC03LDUtSSszPy4nLSAsKTAuKDMpHSgsFBYlFD4tLDY0LSkdKiA3IiQrKBMpLjYc
+ HRpZGxspWDcfWT8WExweIy4/KTopIUgrMyIdKDUsMxMkKTghLS4jOCknMCEhKTEtIygUHzA9
+ PUkmMDAwMDAwSjI2NjY2FhYWFjY2MjIyMjIjMjU1NTUzMzMwMDAwMDBDKCkpKSkUFBQULC0s
+ LCwsLCcsKioqKiQ2JBQqFCkpKSkpKTAsJwIsMzMuNDUWLi4tLCAxMSkwMDAwMDAyKDIoMigy
+ KDc8NzM2KTYpNik2KDYpNyg3KDcoNygyLDIsFhQWFBYUFhQWPSknFjUlJSoUKhQqHCofNi02
+ LTYtLTUtMiwyLDIsLi0uLS4tNyk3KTcpLB0sICwdNSo1KjUqNSo1KjUqSTczJD8rPysaSkMy
+ LDcpLB0jPS43SUkyMy4dOz4zNzY3NyRJNyksHRodAAAAAwAAAAMAAARaAAEAAAAAABwAAwAB
+ AAACJgAGAgoAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAEAAgAAAAAAAAACAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAMBjQGMAAQABQAGAAcACAAJAAoACwAMAA0ADgAP
+ ABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAq
+ ACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAAQQBCAEMARABF
+ AEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaAFsAXABdAF4AXwAA
+ AGAAAABhAGIAYwBkAGUAZgBnAGgAaQBqAGsAAABsAAAAAABtAG4AbwBwAHEAcgBzAHQAdQB2
+ AHcAeAAAAHkAegB7AHwAfQB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQ
+ AJEAkgCTAJQAlQCWAJcAmACZAJoAmwCcAJ0AngCfAKAAoQCiAKMApAADAKYApwCoAKkAqgCr
+ AKwArQCuAK8AsACxALIAswC0ALUAtgC3ALgAuQC6ALsAvAC9AL4AvwDAAMEAwgDDAMQAxQDG
+ AMcAyADJAMoAywDMAM0AzgDPANAA0QDSANMA1ADVANYA1wDYANkA2gAEAjQAAABwAEAABQAw
+ ACIAfgD/ATABMQFAAUIBUQFTAV8BYQF3AX8BkgH/AhsCxwLbAt0DlAOpA7wDwB4DHgseHx5B
+ HlceYR5rHoUe8yAVIBogHiAiICYgMCA6IEQgrCEiISYiAiIGIg8iEiIaIh4iKyJIImAiZSXK
+ +wL//wAAACAAIwCgAQABMQEyAUEBQwFSAVQBYAFiAXgBkgH8AhgCxgLYAtwDlAOpA7wDwB4C
+ HgoeHh5AHlYeYB5qHoAe8iATIBggHCAgICYgMCA5IEQgrCEiISYiAiIGIg8iESIaIh4iKyJI
+ ImAiZCXK+wH//wAA/+H/2//3AAD/9gAA//QAAP/yAAD/8AAA/tD/cf9ZAAD+BwAA/VD9PPzU
+ /SbjdAAA41/jPwAAAADjIAAAAAAAAAAAAAAAAOA+4DgAAOCj37TfU9+/3ube3t7a3tne0t7P
+ 3sPep96Q3o3bKQXzAAEAcAAAAAAAAABuAAAAbAAAAGwAAABsAAAAbAAAAAAAAAB0AAAAdAAA
+ AAAAAAAAAAAAbAAAAAAAagBsAAAAbAB2AHgAfACAAIQAAAAAAIQAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAMBjQGMANsA3ADdAGsAeABpAHYAegFoAWkBagFrAGwAeQFs
+ AGcA3gB0AOMBeAF7AYEBgwGFAYkBeQGCAXoBhAGHAYgBfAGGAHIAcwF1AG0AbgBhAG8AcABj
+ AGUAZgBxAGoAdwAEAjQAAABwAEAABQAwACIAfgD/ATABMQFAAUIBUQFTAV8BYQF3AX8BkgH/
+ AhsCxwLbAt0DlAOpA7wDwB4DHgseHx5BHlceYR5rHoUe8yAVIBogHiAiICYgMCA6IEQgrCEi
+ ISYiAiIGIg8iEiIaIh4iKyJIImAiZSXK+wL//wAAACAAIwCgAQABMQEyAUEBQwFSAVQBYAFi
+ AXgBkgH8AhgCxgLYAtwDlAOpA7wDwB4CHgoeHh5AHlYeYB5qHoAe8iATIBggHCAgICYgMCA5
+ IEQgrCEiISYiAiIGIg8iESIaIh4iKyJIImAiZCXK+wH//wAA/+H/2//3AAD/9gAA//QAAP/y
+ AAD/8AAA/tD/cf9ZAAD+BwAA/VD9PPzU/SbjdAAA41/jPwAAAADjIAAAAAAAAAAAAAAAAOA+
+ 4DgAAOCj37TfU9+/3ube3t7a3tne0t7P3sPep96Q3o3bKQXzAAEAcAAAAAAAAABuAAAAbAAA
+ AGwAAABsAAAAbAAAAAAAAAB0AAAAdAAAAAAAAAAAAAAAbAAAAAAAagBsAAAAbAB2AHgAfACA
+ AIQAAAAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMBjQGMANsA3ADd
+ AGsAeABpAHYAegFoAWkBagFrAGwAeQFsAGcA3gB0AOMBeAF7AYEBgwGFAYkBeQGCAXoBhAGH
+ AYgBfAGGAHIAcwF1AG0AbgBhAG8AcABjAGUAZgBxAGoAdwAAuAAALEu4AAlQWLEBAY5ZuAH/
+ hbgARB25AAkAA19eLbgAASwgIEVpRLABYC24AAIsuAABKiEtuAADLCBGsAMlRlJYI1kgiiCK
+ SWSKIEYgaGFksAQlRiBoYWRSWCNlilkvILAAU1hpILAAVFghsEBZG2kgsABUWCGwQGVZWTot
+ uAAELCBGsAQlRlJYI4pZIEYgamFksAQlRiBqYWRSWCOKWS/9LbgABSxLILADJlBYUViwgEQb
+ sEBEWRshISBFsMBQWLDARBshWVktuAAGLCAgRWlEsAFgICBFfWkYRLABYC24AAcsuAAGKi24
+ AAgsSyCwAyZTWLBAG7AAWYqKILADJlNYIyGwgIqKG4ojWSCwAyZTWCMhuADAioobiiNZILAD
+ JlNYIyG4AQCKihuKI1kgsAMmU1gjIbgBQIqKG4ojWSC4AAMmU1iwAyVFuAGAUFgjIbgBgCMh
+ G7ADJUUjISMhWRshWUQtuAAJLEtTWEVEGyEhWS0AuAAAKwC6AAEAAwACKwG6AAQABAACKwG/
+ AAQAYQBNADwAKwAcAAAACCu/AAUAdgBjAE0ANwAcAAAACCu/AAYAaABNADwAKwAcAAAACCu/
+ AAcAWABNADwAKwAcAAAACCsAvwABAF8ATQA8ACsAHAAAAAgrvwACAHsAYwBNADcAHAAAAAgr
+ vwADAFYATQA8ACsAHAAAAAgrALoACAAEAAcruAAAIEV9aRhEACoAdwBcAIMAdQBgAG0AgQAA
+ ADH9rgBaA/4AAAV/AAAAAAAAAAAAAAAAAWIC4ARmBcQGRgbGB1oIOAkSCYoJxgokCmILNAuq
+ DKQN7A6kD5YQgBD8EmITchPsFKQU/BVwFcoW6hiIGUQa8hu2HJgdyh6iH/whECGMIhQjDiOo
+ JMIlciZ8J1godCnCKvYrpCzGLTYt9i52Lx4wODEAMUIxyDJgMrAy6jP4NSY14jc8OGQ5djqC
+ O4g8HjzIPbY+Rj+wQLRBsEKqQ6ZEjEVqRjpHWEf4SKhJIkmOSr5L4ExkTahN+k8+T7RQ7FGK
+ UoRTLFPyVDxWklaeVvRYyljWWUxZvlqqW3hbqlvkXCZccl36XgZeUmAuYDpgRmBGYOZiImPY
+ ZSJmOmbsZ+hojmneaqRrQmvabBZt7G4obwBv2nCCcVhxjHKec+50OHSmdSh2Jnasd7Z4lnoG
+ eyp7NntCe058NnxCfZ5+8IAqgDaAQoBOgFqAZoBygH6AioG4gcSB0IHcgeiB9IIAgnCDhIOQ
+ g5yDqIO0g8CE+oaQhpyGqIa0hsCGzIbYiRSKOopGilKKXopqinaKgoqOipqL5ovyi/6MCowW
+ jCKMLozSje6N+o4GjhKOHo4qjySPMI+okHiRQpGMkgiSWpMWk5ST9JSGlbaW1pcQmBSZHJne
+ mhyalJvCnKKdOJ3ynoKfEKA+oEqgVqDGoNKg3qDqoPaiGqOIo5SjoKOso7ijxKPQo9yj6KP0
+ pACkCKV6pYalkqWepaqltqXCp3ypBKkQqRypKKk0qUCpTKlYqWSpcKl8qYiplKsCrEysWKxk
+ rHCsfKyIrJStiK64rsSu0K7cruivuK/Er9CwrrC6sMiw1LGosbSxwLHMsdix5LHwsfyyCLIU
+ siCyLLNCtC60OrRGtFK0XrRqtHa0grSOtJq0prSytL60yrTWtOK07rZyt7S48roSuwS7ELv8
+ vSC9LL04vUS9UL1cvWi9dL2AvYy9mL8swL7AysDWwOLA7sD6wQbBEsEewhzCKMI0wkDCTMJY
+ wmTDosTCxP7FCsUWxSLFLsU6xUbFUsVexWrFdsWCxY7FmsWmxbLFvsXKxdbF4sXuxfrGBsak
+ xz4AAAACAB3/BgZMBVIAkgCgARa7AAgABwAVAAQruwCIAAQABQAEK0EhAAYACAAWAAgAJgAI
+ ADYACABGAAgAVgAIAGYACAB2AAgAhgAIAJYACACmAAgAtgAIAMYACADWAAgA5gAIAPYACAAQ
+ XUEDAAYACAABcUEFABUACAAlAAgAAnG4ABUQuQANAAf0uAAVELgAI9C4ACMvuAAVELgAJtC4
+ ACYvuAAIELgAS9C4AEsvuAAFELgAT9C4AIgQuABl0LgAZS+4AIgQuABo0LgAiBC4AHnQuAAI
+ ELgAk9C4AJMvuAAFELgAltC4AJYvuAAFELgAmtC4AAgQuACe0LgAni8AuAAQL7gAWi+6AAUA
+ EABaERI5ugAmABAAWhESOboASwAQAFoREjkwMSU+AzcOAQceAxUUBiMiLgInDgEjIi4CNTQ2
+ MzI2NzQ2Nw4DBw4BIyImNTQ+Ajc+Azc+AzMyHgIVFAYHDgEHPgE/ATU0PgI3PgMzMh4CFRQG
+ BwYUFRQWHQE+AzMyFhUUBgcOAwcVPgMzMhYVFA4CDwEVFA4CIyImNTQDPgE3NTQmNQ4BDwEO
+ AQPRAQMDAgFFjUgGFhcQEBkVMC4kCWCrRC1LOB8gHVX5jwMFM2liViAaKQ8MDRkqOSASQ1dp
+ OQgXGx0PDxMLBQUCBgkFMWAtVgUKDQkMGhkVBgYNCwcXFgIEQnRfRxUnJBglI1hkazVln3VJ
+ DxcQK1N3S7gJEh0UNDLmSZFHAkh4JTMEA3cILD1IJhctFFaTcEsOHCo8drB1FxwZIiYMGBUi
+ HTmGRw8gHhwMIy0lKxsoIBoNBxUXGg1htY1VHS85HB41DiZxQwoTCA+kJlZOQBAWHhEHExoc
+ CRMQBgcVDiVwQX8HCAUBBRAPDQUFDA8RCPoaMCQVDhEKISszHETRHzYpFxsSHAE+DyMRLS9w
+ Og4XCg5SkAAAAAADAE7+7AUOBckAawB5AIYBi7sAUQAFAEsABCu7AC8ABgB1AAQrugAOAEsA
+ LxESOUEFABoAdQAqAHUAAnFBIQAJAHUAGQB1ACkAdQA5AHUASQB1AFkAdQBpAHUAeQB1AIkA
+ dQCZAHUAqQB1ALkAdQDJAHUA2QB1AOkAdQD5AHUAEF1BAwAJAHUAAXG4AHUQuAAZ0LgAGS9B
+ IQAGAFEAFgBRACYAUQA2AFEARgBRAFYAUQBmAFEAdgBRAIYAUQCWAFEApgBRALYAUQDGAFEA
+ 1gBRAOYAUQD2AFEAEF1BAwAGAFEAAXFBBQAVAFEAJQBRAAJxuABLELgAZNC6AHoASwAvERI5
+ ugCCAEsALxESObgALxC4AIjcALgABS+4ADwvuwBWAAEAQwAEK7sAKgABAF8ABCu6AA4APAAF
+ ERI5uABDELgAQdC4AEEvuABWELgAWdC4AFkvuABfELgAWtC4AFovuABfELgAb9C4AG8vuAAq
+ ELgAetC4AHovuAAqELgAfdC4AH0vuAAqELgAf9C4AH8vugCCADwABRESOTAxATQ+AjMyHgIV
+ FAYdAT4BMzIWFx4DFRQOAiMiJjUmIiMiDgIHEx4BFwQRFA4CBx4BFRQOAiMiLgE0JwYjIiYn
+ LgM1NDYzMhYVFB4CMzI2NxEiDgIjIi4CNTQ+BDcBLgEnEz4DNTQuAiU+ATMyFzQ2NQ4DAmoB
+ CRMRExcMBAFypi0OFAUSJyEVEBgdDhIaBQUEF0ZXYjQGSHYqAUtbmMRpAgIZIiMJDgwEAyop
+ J0wjQHBTMBMMDhgpWIpiGjQaPHdsXCEfLyAQKUhleIdHAVsvdUINWJ52RiE6T/zjOnY8VFEC
+ SIhuSwU1EjIvIRckLhgRHw5MIhYBAQMaICEJCRQRCxIVAQwXHxP+yQUMCD/+9UF2YEgTQlYM
+ HTMmFSZIakQDBQgNOU9iNhMaKzcJLzImAwQCDAIDAgUgQj4TNkBGRUIb/d0JCQL+DxhLV1op
+ FzEsI4IEAwNFhD8eREVGAAAAAAMAOf6aBi0FdQBfAIAAlwGAuwAPAAQAVgAEK7sAiQAEAGAA
+ BCu7AHcABACVAAQrQSEABgAPABYADwAmAA8ANgAPAEYADwBWAA8AZgAPAHYADwCGAA8AlgAP
+ AKYADwC2AA8AxgAPANYADwDmAA8A9gAPABBdQQMABgAPAAFxQQUAFQAPACUADwACcboASQBW
+ AHcREjlBBQAaAGAAKgBgAAJxQSEACQBgABkAYAApAGAAOQBgAEkAYABZAGAAaQBgAHkAYACJ
+ AGAAmQBgAKkAYAC5AGAAyQBgANkAYADpAGAA+QBgABBdQQMACQBgAAFxQQUAGgCVACoAlQAC
+ cUEhAAkAlQAZAJUAKQCVADkAlQBJAJUAWQCVAGkAlQB5AJUAiQCVAJkAlQCpAJUAuQCVAMkA
+ lQDZAJUA6QCVAPkAlQAQXUEDAAkAlQABcbgAdxC4AJncALgAKi+4ADwvuwAiAAIACAAEK7sA
+ jgABAHwABCu7ABEAAQBTAAQruAAiELgAANC4AAAvugBJAAgAIhESOTAxATIeAhUUBgcOBRUU
+ MzI+BDU0LgI1ND4CMzIWFz4DMzIWFRQGBw4FBw4DIyImNTQ2Nz4FNw4BBw4FIyImNTQ+Ajc+
+ AxM0PgYzMh4CFRQGDwEeAxUUDgIjIi4CAS4BJw4DFRQeAjMyPgQ1NCYC3w8aEgoQEiR0hIdt
+ RCMie5CVek0GBgYIFikhFx8IOWFMOBESFSsjIW6KnJ+aQS0tGhUVCxEmNTSHl52VhDImYjUX
+ Z4ulqKFCODs5Wm00KmxpW3IvTWRqaVY8CQ4kIRYYGhYTLikbUoerWThmTC0CTg4ZBkKWgFQZ
+ KDMbH09TTz8mGgUvDxcbDRAVAgIxTV5hWiEbLkpcWlAaBBETEgcMIiAXGBUJKSwhKSUXWj88
+ mrfR4/J9VnNGHignMqBqatXRzcK2UxMkCzR3dm1UMkA7KmZpYiYfQjck+2Q/enJoWkgzHAkO
+ EwoUGQwMFUdZZzZTnXtLGz1gAecTHQ4pdYuaTh4mFQcVLERcdkkuTAAAAAMAOf9zBTEFugBp
+ AHcAhQFQuwB1AAcAUgAEK7sALQAGAGUABCu4AC0QuAAL0LgACy+4AGUQuAAT3LgALRC4ABnQ
+ uAAZL7gALRC4ABzQuAAcL7gAZRC4ACTcuAAtELgAQdC4AGUQuABJ0LgASS+6AFkAUgAkERI5
+ QSEABgB1ABYAdQAmAHUANgB1AEYAdQBWAHUAZgB1AHYAdQCGAHUAlgB1AKYAdQC2AHUAxgB1
+ ANYAdQDmAHUA9gB1ABBdQQMABgB1AAFxQQUAFQB1ACUAdQACcboAXgBSAHUREjm4AF4vuABl
+ ELgAbdC4AG0vuABlELgAcNC4AHAvuABlELgAe9C4AHsvugB8AGUASRESObgAXhC5AIEAB/QA
+ uAAAL7gARi+7AGoAAQBNAAQruwB4AAIAWQAEK7oACwBGAAAREjm4AHgQuAA30LgANy+6AHAA
+ RgAAERI5ugB8AEYAABESOTAxATIWFRQGBw4DBz4BMzIeAhUUBgcOAQcUFhc+AzMyFhUUDgIH
+ DgEHEz4DNz4DMzIeAhUUDgIHFA4CIyImPQEOASMiLgI1ND4ENyIuAjU0PgQ3PgMBMjY3NDY1
+ DgMVFBYTMjY3EQ4DFRQeAgMlFRQSEQ8bFA4CNk8TFSYdEBQdJWs/AgIkQjgsDyAqBRIgGyhr
+ PAZRk35kIhAQCwsLDAwGAWOj028CDh8cERZBeThLelcwJj5QUk8eZYVPITFSb3qBPAQlMTj+
+ nzNmMgJPmnlKcIorWi1KjnBFJT1PBboQDAsZCQkfN1M8ERQNFR0PEhgFBhsUM4ZLChYSCyQd
+ DBIPCwYIHxT+sBU/TVowGCsiFAgXJh5IhHBaHj1zWTYaI+gNDB02TjIhPTcwKCENEiY8KRo6
+ Pj47NRZehFMl+0AICE6iVB9FREAaLSUBwg4LAQAaPDw7GhAUCgQAAAABAKADbwGqBbwAKACO
+ uwAFAAcAJAAEK0EFABoAJAAqACQAAnFBIQAJACQAGQAkACkAJAA5ACQASQAkAFkAJABpACQA
+ eQAkAIkAJACZACQAqQAkALkAJADJACQA2QAkAOkAJAD5ACQAEF1BAwAJACQAAXG4ACQQuAAP
+ 0LgADy+4AAUQuQAXAAb0uAAFELgAKtwAuAAAL7gACi8wMQEyHgIVFA4CIyIuAjU0Njc+AzU0
+ LgIjIg4CIyImNTQ+AgEQFTUwIDJIUR4HDAkFHw4kLRgJChEVCwcOEREKBRISHSMFvCRLdFA4
+ Zk4uCg4RBgwbDiI2NDglH0E0IQgJCAoTBBcZEwAAAAEAc/6PBAQFsgAwAHa7AA8ABwAoAAQr
+ QSEABgAPABYADwAmAA8ANgAPAEYADwBWAA8AZgAPAHYADwCGAA8AlgAPAKYADwC2AA8AxgAP
+ ANYADwDmAA8A9gAPABBdQQMABgAPAAFxQQUAFQAPACUADwACcQC4AAAvuwAUAAMAIwAEKzAx
+ ATIWFRQOAgcOBRUUHgIzMjY3NjMyHgIVFA4CIyIuAjU0Ej4FA98WDwQMFRIyk6KhgVAzTl0q
+ V44tDwgHCQQCNFp4Q2WRXSxDcJGcmoJeBbISEwcLDhINJY294vb+em+RVSM3JQwNExgMHT0y
+ IFKGqFeGAQPx27uXazoAAAABACn+mgPRBb4ANwCOuwAvAAcAFgAEK0EFABoAFgAqABYAAnFB
+ IQAJABYAGQAWACkAFgA5ABYASQAWAFkAFgBpABYAeQAWAIkAFgCZABYAqQAWALkAFgDJABYA
+ 2QAWAOkAFgD5ABYAEF1BAwAJABYAAXG4AC8QuAA53AC7AA8AAwAAAAQruwAoAAMAGwAEK7gA
+ ABC5AAoAA/QwMRMiLgI1ND4CMzIeAjMyPgMSNTQuAiMiBgcGIyImNTQ+AjMyHgQVFAIOBcsm
+ PCoWExwhDgsCDCYwP4qGeVw2N117RSs8HAwICwwnP1IrQ3JcRzAYL1Jte4N9cf6aFCAnExMm
+ HxMbIBszaJ7VAQ2jjeGdVQkLBRIWFSohFDNae46bTrH+3eq0hlw4GQAAAAEASwIGA0UFiwBc
+ AMa7AD4ABgBGAAQruABGELgADtC4AA4vQSEABgA+ABYAPgAmAD4ANgA+AEYAPgBWAD4AZgA+
+ AHYAPgCGAD4AlgA+AKYAPgC2AD4AxgA+ANYAPgDmAD4A9gA+ABBdQQMABgA+AAFxQQUAFQA+
+ ACUAPgACcbgAPhC4ADvQuAA7L7gARhC4AEnQuABJLwC4ABUvuABBL7oADgBBABUREjm6AB0A
+ QQAVERI5ugAtAEEAFRESOboAOwBBABUREjm6AEkAQQAVERI5MDETLgE1NDYzMhYXHgMXPgUz
+ Mh4CFRQGFT4DMzIWFRQGBw4DBx4DFRQOAiMiJi8BBhQVFAYjIi4CNTQ2Nw4DIyIuAjU0PgI3
+ LgNtEhAfFRImDgknN0QmAQMFBwoPCgkYFQ8CPUkvHxQRFh8VBiQ1QSJdcj0UDRQaDAgOBecC
+ KiYICwcDAQEnPjInERUaDQQZOV1EK1FFNgRvDxsLERMOEAodIygVGkpQTz4nFCIxHEReIjdB
+ IQoKCg0kEQUjNEAiNkQuHxIOFhAJAwWXJnJXOC8gN0srGzcdJjIcCwsPDgMOEiREQBw4MCgA
+ AAEASP/4BOEE1QBbAMG7AEQABwAPAAQrQQUAGgAPACoADwACcUEhAAkADwAZAA8AKQAPADkA
+ DwBJAA8AWQAPAGkADwB5AA8AiQAPAJkADwCpAA8AuQAPAMkADwDZAA8A6QAPAPkADwAQXUED
+ AAkADwABcbgARBC4AEHQuABBL7gADxC4AE/QuABPLwC4ABcvuAAARVi4AEcvG7kARwAIPlm7
+ AAUAAQBUAAQruwAnAAMANAAEK7gANBC4AADQuAAAL7gANBC4ADHQuAAxLzAxEzIeAjMyPgQ3
+ MjYzLgM1NDYzMh4CFRQWHwE+BTMyHgIVFA4CIyImIyIOAg8BHgUXHgEVFAYjIiY1NC4CJw4D
+ IyIuAjU0Nm0MExwvJwswQEhFOxMCAgIICggDDBEHHyAYBgUIKFxdWEkyCBQhGA0KDhEGDQ8T
+ BSAzQSX0AQMEBAMEAQECGBocIwQGCAU0ZVxOHS9FLhYMArQRFREECAsODwkCiatmMhIgGxou
+ QCYZbkR9ChYWEw4JDxcbDA4XEQoKBw0QCTscVF9jVkMQDBUKKC5RPgxSdpFNCxQOCCQvKwcW
+ FQAAAAABAKj+1wJGAVgAJwB+uwADAAYAFwAEK0EFABoAFwAqABcAAnFBIQAJABcAGQAXACkA
+ FwA5ABcASQAXAFkAFwBpABcAeQAXAIkAFwCZABcAqQAXALkAFwDJABcA2QAXAOkAFwD5ABcA
+ EF1BAwAJABcAAXG4AAMQuAAp3AC4AAovuwAAAAIAHAAEKzAxATIWFRQOBCMiJjU0PgI3PgM1
+ NC4CIyIOAiMiNTQ+AgGmTlIpQlNSSRgXFgMKEg4tXEswDBETBxEaFhYMIBMiMgFYZmEnX2Nd
+ SCwgFQkNDRALIlReZjYTGQ8FCQsJHw8gGxIAAAABAGoBVANeAhcAIAAXALsADwADABoABCu4
+ ABoQuQAFAAH0MDETMh4CMzI+Ajc+AzMyFhUUBgcOAyMiNTQ+An0FCRMlIg1DT0oVQGRSRiMR
+ Cx4uGGiTt2l1AgQIAeMGCAYGCAkDCRANCBALEysQCB4eFkIIGhkSAAABAQ7/2QISAPgAHABm
+ ugADAA0AAytBGwAGAAMAFgADACYAAwA2AAMARgADAFYAAwBmAAMAdgADAIYAAwCWAAMApgAD
+ ALYAAwDGAAMADV1BBQDVAAMA5QADAAJdALgAAC+4AABFWLgACi8buQAKAAg+WTAxJTIWFRQO
+ BCMiJjU0PgI3PgEzMhYzMj4CAdUWJxsqMzIqCxITBg0UDwgKBAcJCAcUGR74Ji4WMC0oHhIm
+ IBArLSsRCQcLDxIPAAH/0f7jA4gGJQAkAAsAuAAOL7gAIi8wMQc0PgISPgI3PgMzMhYVFA4D
+ AgcOAwcOAyMiJi87Yn+KinZaFBMdGRkREh41W3uMlkkiOTAoDwsQEBMOIBPTLanb/gED+dOd
+ JSNCNB8gGxh0q9r+/uWVRXJpZTkpNR8NIgAAAAACADkABATRBNkAIABCAO+4AEMvuABEL7gA
+ Cty4AEMQuAAY0LgAGC+5ADIABfRBIQAGADIAFgAyACYAMgA2ADIARgAyAFYAMgBmADIAdgAy
+ AIYAMgCWADIApgAyALYAMgDGADIA1gAyAOYAMgD2ADIAEF1BAwAGADIAAXFBBQAVADIAJQAy
+ AAJxuAAKELkAQAAF9EEFABoAQAAqAEAAAnFBIQAJAEAAGQBAACkAQAA5AEAASQBAAFkAQABp
+ AEAAeQBAAIkAQACZAEAAqQBAALkAQADJAEAA2QBAAOkAQAD5AEAAEF1BAwAJAEAAAXEAuAAA
+ L7sANwADABMABCswMQEyHgIXHgMVFA4GIyIuAjU0PgYXIg4CBw4DBw4FFRQeAjMyPgY1NCYE
+ Nx0gFhIQDg8HATxnipymn484IkU4JEd3naywnoI6EDtIUCURHyInGStweHRbOA4VFwkzhZWc
+ lIJiORcE2RwlKAwLMTgzDWG3qZd/Z0gmJkVjPE6npqCPeFgxuhQiLxwMBAIIER1Xa3uFikMO
+ FQ8IJkVid4qXoFEjGQAAAAABAOn/xwHDBTEAKQBwuwAOAAcAIgAEK0EhAAYADgAWAA4AJgAO
+ ADYADgBGAA4AVgAOAGYADgB2AA4AhgAOAJYADgCmAA4AtgAOAMYADgDWAA4A5gAOAPYADgAQ
+ XUEDAAYADgABcUEFABUADgAlAA4AAnEAuAAdL7gAAC8wMQEyFxQOBAcOAxUUFhc2MzIVFAYH
+ DgMjIi4CNRASNz4DAa4SAwgNDw4NAwUJBgMMCRUMDBIJDxYWHBUSFw4FLCYCIigjBTEYBDxZ
+ a2hZGyh/madQMFAVCgwLIg0UJh4SCzBiVgENAgHsDyooHAAAAAEAOf/LBPoE7gBbAQW4AFwv
+ uABdL7gABdy4AFwQuABV0LgAVS+5AEgAB/RBIQAGAEgAFgBIACYASAA2AEgARgBIAFYASABm
+ AEgAdgBIAIYASACWAEgApgBIALYASADGAEgA1gBIAOYASAD2AEgAEF1BAwAGAEgAAXFBBQAV
+ AEgAJQBIAAJxugARAFUASBESObgABRC5AD4ABPRBBQAaAD4AKgA+AAJxQSEACQA+ABkAPgAp
+ AD4AOQA+AEkAPgBZAD4AaQA+AHkAPgCJAD4AmQA+AKkAPgC5AD4AyQA+ANkAPgDpAD4A+QA+
+ ABBdQQMACQA+AAFxuABIELgAS9C4AEsvALgALS+7AAAAAwBBAAQrMDEBMh4CFRQOAgcOBQc+
+ Bzc2MzIWFRQOAgcOByMiLgI1ND4ENz4DNTQmIyIOBBUUFhUUDgIjIi4CNTQ+BAONO1IyFkR3
+ oFsZS1hdVUQTH3SSpqaaeU8HDwwPDwkSHRQKYpW3vrWRXQYMHhoSLk1lcHQ0f6toLSsjOoSD
+ eV04BBQbGQUFFBQOOWSInKkE7iE2RSM8ipCRRBI3Q0pKRx4HGiAkJCEbEAIDDxMNJSQeBwMZ
+ IysrKSATEx8nEx9NV1xcVyZcmnxgIhcoHi86Ny4MAwcDCQ0JBRIdIhAQP0xPQSkAAAAAAQA5
+ /98FEATZAGYBg7sAEQAFACoABCtBBQAaACoAKgAqAAJxQSEACQAqABkAKgApACoAOQAqAEkA
+ KgBZACoAaQAqAHkAKgCJACoAmQAqAKkAKgC5ACoAyQAqANkAKgDpACoA+QAqABBdQQMACQAq
+ AAFxuAARELgAaNwAuAAAL7gAAEVYuAAWLxu5ABYACD5ZuwBfAAMATQAEK7sADAADADEABCu4
+ AAwQuAAJ0LgACS+4ABYQuQAgAAP0QSEABwAgABcAIAAnACAANwAgAEcAIABXACAAZwAgAHcA
+ IACHACAAlwAgAKcAIAC3ACAAxwAgANcAIADnACAA9wAgABBdQQMABwAgAAFxQQUAFgAgACYA
+ IAACcbgAFhC5ACUAA/RBIQAHACUAFwAlACcAJQA3ACUARwAlAFcAJQBnACUAdwAlAIcAJQCX
+ ACUApwAlALcAJQDHACUA1wAlAOcAJQD3ACUAEF1BAwAHACUAAXFBBQAWACUAJgAlAAJxugBI
+ AE0AXxESObgATRC5AFcAA/QwMQEyFRQOBAc2MjMyHgIVFA4CIyIuAjU0PgIzMh4CMzI+AjU0
+ LgQjIg4CBw4BIyImNTQ2Nz4HNw4DIyIuAjU0PgIzMhYXHgIyMzI+Ajc+AQTnKT5mg4iEMxYo
+ FISsYydYrP+nV6eEURoqMhgXN1F2Vn3Lj00nQFVaWycmYGFYHxo3FQ4XEgsERGyIj4txTAlD
+ lZWJN2+FRRUZJzIaJk8aHjY2OiE8h31oHSlSBNkdFkFNU1JKHQI0Vm86VrSUXhwpLRENJCEX
+ HCEcOF16QitALR0RBgwWHhIPGRAOCxUHAik/UVVTRTAHEh0UCg0VGw4OJB8WFhEFBQMQGBsL
+ DxIAAAACACP/tgX4BPgAVwBsAEcAuAAAL7gAKy+7ABIAAwAcAAQrugANABwAEhESOboAMgAr
+ AAAREjm6AFUAKwAAERI5ugBYACsAABESOboAYQArAAAREjkwMQEyHgIVFAYHDgMHPgMzMh4C
+ FRQOAgcOAwcOAwcOAyMiNTQ+AjcOAwcOAyMiLgI1NDY3Pgc3PgEzMh4CFz4BAT4BNz4DPwEO
+ AwcOBQOTCx4cFA0IBQ0PDwdTm4VnIBEhGxERGR4MJnCLoVUGCQkMCQggIx4HDgQOGhdUqZyL
+ Nh0mGhMLCxELBhkiFEdYZmdjVUARFyILBBQWEwMIEP3TY/aACRANCQIGCCEpLBMQOEZOSkIE
+ +BcjKxQOIQ4JTGt8OQ4YEQoYISILCw4IAwEDDRIYDjKHi4ArJjgmEhsCMoTouA4eIB8OCA8M
+ CBsmKQ0aIQgFMEleZWVaSBUdLhAXGgomNv1kFjEXS4luSgwvDy40NRYSOkRKRDoAAAH/xQAp
+ BjsE1wB0ALK7ACkABgBHAAQrQQUAGgBHACoARwACcUEhAAkARwAZAEcAKQBHADkARwBJAEcA
+ WQBHAGkARwB5AEcAiQBHAJkARwCpAEcAuQBHAMkARwDZAEcA6QBHAPkARwAQXUEDAAkARwAB
+ cbgAKRC4AHbcALgAaC+7AEIAAQAwAAQruwAAAAEAEAAEK7sAJAADAEwABCu4ABAQuAAN0LgA
+ DS+6AB8ATAAkERI5ugBwABAAABESOTAxATIeAhceAxUUBiMiBgcOBSMiJicOAwc+AzMyHgIV
+ FA4EIyIuAjU0PgIzMhYXHgMzMiQ+ATU0LgIjIg4CBw4DIyIuAjU0Njc+BTc+ATMyHgIVFAYV
+ PgME4SdTSDcLEh8XDkM/P65qMnFvaFU8CwYLBg8lJiYRC0VsjFFffkseOWiTs89xZpllMwYJ
+ DAULCgoFLUddNrQBIMtsGz5lST2BeGYiEx8ZEwYGDAgFFxoJJS80LyUJDg8KBBgaEwIziqa7
+ BLIFBggDBRMWFwkLBQIFAwkLDAoGAgIkTUg9FAcfIRkpRl00SYx+ak0rGy08IAobGBEiFAsW
+ EgxIdJRMITYnFRglLBQLHRsTFyElDhseFgc2T15eVh8xLQsTHBIDCAUKFA8KAAACADn/ywVU
+ BPwAOwBMAQe4AE0vuABOL7gACty4AE0QuAAe0LgAHi+5ADYAB/RBIQAGADYAFgA2ACYANgA2
+ ADYARgA2AFYANgBmADYAdgA2AIYANgCWADYApgA2ALYANgDGADYA1gA2AOYANgD2ADYAEF1B
+ AwAGADYAAXFBBQAVADYAJQA2AAJxugBDAB4AChESObgAChC5AEoAB/RBBQAaAEoAKgBKAAJx
+ QSEACQBKABkASgApAEoAOQBKAEkASgBZAEoAaQBKAHkASgCJAEoAmQBKAKkASgC5AEoAyQBK
+ ANkASgDpAEoA+QBKABBdQQMACQBKAAFxALgAJy+4ABYvuwAHAAEAPAAEK7oAQwAWACcREjkw
+ MSU+BTMyFhUUDgQHFA4CIyImJy4DNTQ+BjMyFhUUDgIHDgUVFB4CMwEiDgQHPgU1NCYBeyJy
+ jqOookdHPEJxmK26WhQfKRUfMwxee0keN116hoh5YhwVEAQMFhIrfImHbEMeLTcaAvceaHuA
+ b1ANYa6Ud1QtIW1Okn9pSyorMTV3eHNhShIKEQ0HEBEEKEBXNECfrLClkGs+EhMHDA0SDSB5
+ nbe8tk0jMB4OAcohPFJkcDsONUNNT0sgFB0AAAABADn/6QTdBOEARwA0ALgAFS+4AABFWLgA
+ KS8buQApAAg+WbsAEAABADsABCu4ABAQuAAA3LoANgA7ABAREjkwMRMiJjU0PgI3PgEzMh4C
+ MzI+AjMyFhUUDgIHDgUHDgMjIiY1NDY3PgU3DgMjIi4CJw4BBw4DbSAUHSYlCRpTLxZJdah1
+ Xo5kOwsJBw8WHA0oW11dU0UYFSosLhkpKyknFkhYY2RfKBxRWVchIWlvZBwJLCUSHRkaAwQl
+ GQw+SkYVPz4RFREhKCEYEQwcICQTOpGgpZuHMitVQykcGg9MPCKBobWtmTQGCwcFBgoKBRRc
+ Ph8tHg8AAAMAXv/FBNkE5wA3AFAAbQGquwBmAAcADQAEK7sALAAHAEsABCtBIQAGAGYAFgBm
+ ACYAZgA2AGYARgBmAFYAZgBmAGYAdgBmAIYAZgCWAGYApgBmALYAZgDGAGYA1gBmAOYAZgD2
+ AGYAEF1BAwAGAGYAAXFBBQAVAGYAJQBmAAJxugAAAA0AZhESObgAAC9BBQAaAEsAKgBLAAJx
+ QSEACQBLABkASwApAEsAOQBLAEkASwBZAEsAaQBLAHkASwCJAEsAmQBLAKkASwC5AEsAyQBL
+ ANkASwDpAEsA+QBLABBdQQMACQBLAAFxugBWAEsALBESObgAVi9BBQAaAFYAKgBWAAJxQSEA
+ CQBWABkAVgApAFYAOQBWAEkAVgBZAFYAaQBWAHkAVgCJAFYAmQBWAKkAVgC5AFYAyQBWANkA
+ VgDpAFYA+QBWABBdQQMACQBWAAFxuQAiAAf0ugAFAA0AIhESOboAJwANACIREjm4AAAQuQA/
+ AAf0uAAiELgAb9wAuAAZL7sARAABADMABCu7AB8AAwBcAAQruwBpAAEACAAEK7gACBC4AAXQ
+ uAAFL7gAXBC4AFnQuABZLzAxNzQ+AjcOASMiLgI1ND4ENz4DMzIWFz4BMzIWFRQOAgceAxUU
+ DgQjIi4CAQ4FFRQeAjMyPgQ1NCYnLgEnPgM1NCYjIgYjIiYnDgUVFBYzMj4CuhwwQCQaMRcx
+ QicQIThLVVkrNIWDbx4ZJgsaPR81QDhgg0sxVkElL1Jwg5FJRX1eOAJpJWZsalM0IzdFIiZj
+ amZRMT4/GhpjWIthNBwUESgRERcBNo6Xk3NHHCsiXGlwwytUUEoiBQMaKTQaJU1NSkU9GR9C
+ NyQYEQsONDslXWdqMgkzTmY9QX1vXEMlGz1hAjIWPktXYWc2KTYgDBoxSFttP0hgHgwKRDJf
+ VkgbFAwFCg4NOU1bXFYiHCYUIzIAAgA5/8UEmgTJADwAWAE1uABZL7gAWi+4AFkQuAAA0LgA
+ AC+4AFoQuAAa3LgACtC4AAovuAAaELkALAAH9EEFABoALAAqACwAAnFBIQAJACwAGQAsACkA
+ LAA5ACwASQAsAFkALABpACwAeQAsAIkALACZACwAqQAsALkALADJACwA2QAsAOkALAD5ACwA
+ EF1BAwAJACwAAXG6ADMAGgAsERI5uABG0LgARi+4AAAQuQBNAAf0QSEABgBNABYATQAmAE0A
+ NgBNAEYATQBWAE0AZgBNAHYATQCGAE0AlgBNAKYATQC2AE0AxgBNANYATQDmAE0A9gBNABBd
+ QQMABgBNAAFxQQUAFQBNACUATQACcQC4AA0vuAAnL7sABwABAEYABCu7AFIAAwA6AAQrugAz
+ ACcADRESObgARhC4AEPQuABDLzAxEzQ+BDMyFhc+ATMyFhUUBgcOBRUUHgIVFAYHDgMjIi4C
+ NTQ+BDcOBSMiJiU+ATU0JjUuASMiDgQVFB4CMzI+BDlYkr7My1cWJBAaIBEcGh4aCRAPDQkF
+ Cw4LBAQGDRMeFhkcDQMFCQ0REgsYXnuQk447YG8DjBoQARMrGjSQmpd4ShsuPCEsa3NxY00C
+ 9CdhZGBLLQUFEAsUDxBgRBZri5yOcxxCRiQRDggTDhQpIhUkOkklElZ1iYuDNBAnKCUdETjv
+ FDwiBw4IAgUdLjs8ORQKCwYBDhceISIAAAIBYv/bAm0DxwAPACcAeroAAwAKAAMrQQUA2gAK
+ AOoACgACXUEbAAkACgAZAAoAKQAKADkACgBJAAoAWQAKAGkACgB5AAoAiQAKAJkACgCpAAoA
+ uQAKAMkACgANXbgAAxC4ABPQuAAKELgAG9C4ABsvALgAAC+4AABFWLgAGC8buQAYAAg+WTAx
+ ATIWFRQOAiMiNTQ2Nz4BEzIWFRQOAiMiJjU0PgI3PgM3PgECLxYoKz1CF0QnMhk+FxYoKTpD
+ GR0vBQ4WEQ8PDREPESADxyYuIkU4JD4uVCoVGP0xJi4gRjwnKiAQJSYjDw0HAgQLDBUAAAAC
+ AJ7+kwKBA8cAJwA3ANS6ACsAIwADK0EFANoAIwDqACMAAl1BGwAJACMAGQAjACkAIwA5ACMA
+ SQAjAFkAIwBpACMAeQAjAIkAIwCZACMAqQAjALkAIwDJACMADV26ABkAIwArERI5uAAZL0EF
+ ABoAGQAqABkAAnFBIQAJABkAGQAZACkAGQA5ABkASQAZAFkAGQBpABkAeQAZAIkAGQCZABkA
+ qQAZALkAGQDJABkA2QAZAOkAGQD5ABkAEF1BAwAJABkAAXG5AAUABvS4ACMQuAAy0LgAMi8A
+ uAAoL7gADC8wMQEyHgIVFA4EIyImNTQ2Nz4FNTQmIyIOAiMiNTQ+AhMyFhUUDgIjIjU0Njc+
+ AQHjFjcwITBOYWFYHhcWFhcPPEpOQCkgDggbHh8MIRMiMmQWJys8QhdEJjIaPgFYESxNOyhr
+ cW9XNiAWFhcQCjVJWFpWJCclDQ8NHw8gGxICbyYuIkU4JD4tVSoVGAAAAAEAOQArBJEEnAA0
+ AB0AuAAAL7sAFAABAB4ABCu4ABQQuAAX0LgAFy8wMQEyFhUUDgIHDgMHHgUzMjYzMhUUDgIj
+ Ii4EJy4BNTQ2Nz4DNz4DBHkLDQ4XHhGJ4sq/Zg5eiqmzsEwRHQsPISssC2KlkoaGjVEiGCMf
+ buPn5nEbIxgRBJwQDwsbHRwMXYtyZzoOQlVbTDEGDRElHhQhOUxXXS0TKBkfIxRGfXt9RRAY
+ EAgAAgBRAUQEogP6ACEAUQALALgAQi+4AAcvMDEBDgUjIi4CNTQ2Nz4FPwE+ATMyFhUUDgIT
+ Ig4EBw4FIyIuAjU0PgIzMj4CNz4BMzIeAhUUDgIjIiY1NCYDNShuen9wWRgVKiEUHikVYH+T
+ kIEulgYNBgoRK0VX7A0+UFpURRMTSFhgVkIPFxsNAwEIEQ8PTm+JS5HSSyUwHAoMDw8DBg8I
+ AbQMGRkXEQoGER0XExsMBg4PEhQYDSsCAgsOEisqJgHgCxAUExAEBBATFBEKDBQWCwsSDQcT
+ HSIPHBcJEhkQEBcPBwcPCwYAAAEAIwBWBH0EkQA0ACEAuAAAL7gAAy+7ACUAAQAbAAQruAAb
+ ELgAHtC4AB4vMDE3DgEjIiY1ND4CMzIXPgM3LgcjIgYjIjU0PgIzMh4CFx4BFRQGBw4Dsggm
+ FB0wFyImDhUDYNXY0V0KP1xxenxxXh8RHQsOFic1H0KqyeJ6IhccHWjZ5e9eAwUQFw8iHBMU
+ GWSBlUoKKzlCQj4vHAcNGCccD0RuiEMTJxkeOBdSlYBpAAAAAAIATv/HA7YFMQBPAGABPbsA
+ PAAGAEkABCu7AAUABQAwAAQrugBTAFsAAytBBQAaADAAKgAwAAJxQSEACQAwABkAMAApADAA
+ OQAwAEkAMABZADAAaQAwAHkAMACJADAAmQAwAKkAMAC5ADAAyQAwANkAMADpADAA+QAwABBd
+ QQMACQAwAAFxQSEABgA8ABYAPAAmADwANgA8AEYAPABWADwAZgA8AHYAPACGADwAlgA8AKYA
+ PAC2ADwAxgA8ANYAPADmADwA9gA8ABBdQQMABgA8AAFxQQUAFQA8ACUAPAACcbgAPBC4AD/Q
+ uAA/L0EbAAYAUwAWAFMAJgBTADYAUwBGAFMAVgBTAGYAUwB2AFMAhgBTAJYAUwCmAFMAtgBT
+ AMYAUwANXUEFANUAUwDlAFMAAl24AAUQuABi3AC4AFgvuwAAAAMANQAEKzAxATIeAhUUDgIH
+ DgMHMj4CNzYzMhYVFAYHDgMjIi4CNTQ+Ajc+AzU0LgIjIg4EFRQWFRQOAiMiLgI1ND4EAzIW
+ FRQOAiMiJjU0Njc+AQMMJT8tGT9wm1wTKSEWARhRVkgPEAsQDygoFFNbURIMJCAXByhYUFOJ
+ YTYGDhcSOoeIfmE6BBQbGQQGDQsHOWSInKmHFigrPUIXIiInMho9BTEdMEAjPImPj0IOICEh
+ DwsPDgMDDxMaMg4HDQsGBhEdGBMyQlY2OHdvYSIMFxILHzA7OC8LBAYECQ0JBBIcIhAQQEtP
+ QSn7rCYuIkU4Ix0gL1MqFhcAAAIAOf8tBpMFaABvAIMB67sATAAEAGcABCu7AIEABwAgAAQr
+ uwA2AAUAEQAEK7sABQAFAEAABCtBBQAaABEAKgARAAJxQSEACQARABkAEQApABEAOQARAEkA
+ EQBZABEAaQARAHkAEQCJABEAmQARAKkAEQC5ABEAyQARANkAEQDpABEA+QARABBdQQMACQAR
+ AAFxuAARELgAFNC4ABQvQQUAGgBAACoAQAACcUEhAAkAQAAZAEAAKQBAADkAQABJAEAAWQBA
+ AGkAQAB5AEAAiQBAAJkAQACpAEAAuQBAAMkAQADZAEAA6QBAAPkAQAAQXUEDAAkAQAABcUEh
+ AAYATAAWAEwAJgBMADYATABGAEwAVgBMAGYATAB2AEwAhgBMAJYATACmAEwAtgBMAMYATADW
+ AEwA5gBMAPYATAAQXUEDAAYATAABcUEFABUATAAlAEwAAnG4ABEQuAB30LgAdy+6AHoAEQA2
+ ERI5QSEABgCBABYAgQAmAIEANgCBAEYAgQBWAIEAZgCBAHYAgQCGAIEAlgCBAKYAgQC2AIEA
+ xgCBANYAgQDmAIEA9gCBABBdQQMABgCBAAFxQQUAFQCBACUAgQACcbgABRC4AIXcALsATwAC
+ AGIABCu7AAAAAwBDAAQruwBwAAEAGwAEK7gAGxC4AFjQuABYLzAxATIeAhUUDgQjIi4CNTQ2
+ Nw4FIyIuAjU0PgQ3PgEzMh4CFRQOBBUUFhc+BTU0JiMiDgYVFBYzMj4ENzYzMhUUBgcOAyMi
+ LgI1ND4GATI+BDc+ATcOBRUUFgUhcJBSIBwyR1hlNyAuHA0BAiBYaXV4dzY3TjIYUIizxs5e
+ BgwGDBQPCQUICQgFCQsiR0M8LRqJkz+ktsC1oXhGlYg7eHJoV0ITDAgOFx0gcJGqWGGXaTdJ
+ f6zE087A/WE0dXh1Z1QaBQsGP5qflXVGHwVoRnKTTkinqJt4SCA5UDAKHxMiTEtENB8aLTkg
+ L3h/gXFbGiAoDxkhEgk2UGJoZyw1Sw4TSGJ4hpFJgo4wWH2as8XUbYN9Fyc0OTobEB8WPhoc
+ T0gyLF+Wam3c0sOqjGU3+6ggNUZLSyE2dDYTRFdkZmAoHRUAAAIAI/9tBUIFsABmAHUANQC4
+ AAAvuAArL7sAWAADAFAABCu4AFAQuABN0LgATS+6AGwAKwAAERI5ugBxACsAABESOTAxATIe
+ AhUUDgIVFBYXHgEXPgM3NjMyFRQOAgceAxceAxUUBiMiJicuBScOAwcOAQcOAyMiLgI1NDY3
+ PgE3DgEjIi4CNTQ2Nz4BNz4DNz4FEy4DJw4DBz4DAvYHICEaERMRGQ4XOSA5W1NRLwkGEkFo
+ gkAXMDIyGgsbFxAeFyI/FBAmJygkIAw4a3aKVhgzIg4QDA0KCx0aEhcWBRkTFh4KGCcdEBwu
+ LU8nH0M/OBMKJjA0MSlgFCcjHgsfTE5HGStwdGsFsAQNGRUJHCYsGTJzNl3acw4YFhcNAw0L
+ Ljc3E06XiHQrFRwVDwgPEw0XEk9ndnVqJxIdHBwQPI1eJjYkERspMBUpSzYMOCkCAhMcIA0U
+ EQICDAZAiYFvJhRacHhiQPySSZeRhjhCq7ClPQcUFhYAAAACAKT/mAY7BS8AUgCPAeW7ABwA
+ BwAoAAQruwAFAAcAfgAEK7sAEgAFAGQABCu4ACgQuAAl0LgAJS+6AAoAJQASERI5uAAoELgA
+ LdC4ABwQuQA0AAX0ugBOACUAEhESObgAHBC4AFPQuABTL7gAHBC4AFjQuABYL0EFABoAZAAq
+ AGQAAnFBIQAJAGQAGQBkACkAZAA5AGQASQBkAFkAZABpAGQAeQBkAIkAZACZAGQAqQBkALkA
+ ZADJAGQA2QBkAOkAZAD5AGQAEF1BAwAJAGQAAXFBBQAaAH4AKgB+AAJxQSEACQB+ABkAfgAp
+ AH4AOQB+AEkAfgBZAH4AaQB+AHkAfgCJAH4AmQB+AKkAfgC5AH4AyQB+ANkAfgDpAH4A+QB+
+ ABBdQQMACQB+AAFxuAAcELgAi9C4AIsvuAASELgAkdwAuABGL7gAIi+4AABFWLgAGS8buQAZ
+ AAg+WbsAAAADAIMABCu7AA0AAgBnAAQrugAKAGcADRESObgAGRC5AF0AA/RBIQAHAF0AFwBd
+ ACcAXQA3AF0ARwBdAFcAXQBnAF0AdwBdAIcAXQCXAF0ApwBdALcAXQDHAF0A1wBdAOcAXQD3
+ AF0AEF1BAwAHAF0AAXFBBQAWAF0AJgBdAAJxugAcABkAXRESOboATgCDAAAREjkwMQEyHgIV
+ FA4CBz4BMzIeAhUUDgQjIiYnFRQOAiMiJjU0NjUmNTQ2Nz4FNzwBNy4DNTQ+Ajc+AzMyHgIV
+ FAYVPgMBFB4CFx4DMzI+BDU0JiMiDgIHDgMjIiY1NDY3PgU1NC4CIyIOAgcOAQcOAwQlR2I8
+ GyE6Ty0+ezRFYj0cT4q92u94OoU7HSQjBgoPBxsODQECAwQFBgMCDyMeFAkaLiYHEhEQBwsd
+ GhICTqKinf2DAQICAQ8rQFtAa9XBpXlFcWYpc4KGOzZYSDYTJhsQI0Wal4lpPh4sLxImg5ic
+ QDJAFwUGBAIFBg8gMCIjRUI/Hw4LIzpNK02mn5BtQA0RDiApGAkOFRBVNB0nFx0JImZ4hIBy
+ LAULBgYUFxgJDBQWGxQwVkAlGCUvFwsTCR8wIRH9RB1ZaXA0DBgVDTpge4J+MzQ6ChMbEQ8f
+ GQ8hIB8gCRI1PUE9MhEKDAYBER8sGxUlDyxhY18AAAEAOf/PBXwFFAA+AN67ABYABQA1AAQr
+ QSEABgAWABYAFgAmABYANgAWAEYAFgBWABYAZgAWAHYAFgCGABYAlgAWAKYAFgC2ABYAxgAW
+ ANYAFgDmABYA9gAWABBdQQMABgAWAAFxQQUAFQAWACUAFgACcQC4AAAvuAAARVi4ADAvG7kA
+ MAAIPlm5ABsAAfRBIQAHABsAFwAbACcAGwA3ABsARwAbAFcAGwBnABsAdwAbAIcAGwCXABsA
+ pwAbALcAGwDHABsA1wAbAOcAGwD3ABsAEF1BAwAHABsAAXFBBQAWABsAJgAbAAJxMDEBMh4C
+ FRQOAiMiJicOBxUUHgIzMj4ENzYzMhUOAQcOBSMiLgI1ND4CNz4DBEgPIx4UHy83FxIzGRBV
+ dYuNg2Y9CxwwJjulvc7HuUoWDgwBDxJHrb/Jw7dNRFYyEjx1rHBst5NsBRQYIiQMDSglGwUK
+ CDxeeIiRkYk7Gy0fESZDW2hxOBAMCB4SR4Z3Y0coIDxUM1S1vsVkYIxaLAAAAgCH/7IFmgVc
+ ADsAUwDkugBDAC0AAyu7AB8ABQBKAAQrQRsABgBDABYAQwAmAEMANgBDAEYAQwBWAEMAZgBD
+ AHYAQwCGAEMAlgBDAKYAQwC2AEMAxgBDAA1dQQUA1QBDAOUAQwACXbgAQxC5ADcAB/RBBQAa
+ AEoAKgBKAAJxQSEACQBKABkASgApAEoAOQBKAEkASgBZAEoAaQBKAHkASgCJAEoAmQBKAKkA
+ SgC5AEoAyQBKANkASgDpAEoA+QBKABBdQQMACQBKAAFxuAAfELgAVdwAuAAoL7gADS+7ABgA
+ AwBPAAQrugBDACgADRESOTAxEyIuAjU0Ny4BNTQ2MzIeAh8BPgMzMh4EFRQOBiMiLgI1ND4C
+ Ny4DJy4DNx4FFz4FNTQuAiMiDgLPChINCCMEAggOCx0cFQMIKFZQQhVt0bmbcD5MgqzDzMGq
+ PxUjGQ8NIjksBAUEAwEFDxAQcAcRDw4LBgFj2NK+kFVbq/abQ2xWQgPPCBcnICIaKEEmJTcQ
+ HSkaSAoMCAMkQ190hkk2fIKCdmdMKxskJgwWDwMBCCJJRj4VT6ilmoJIpa2snokyHWB2gn5w
+ Ki9yZEMJDxQAAAACANP/5wXvBUgAXQCNAOu7ABwABwBNAAQruAAcELgAENC4ABAvuAAcELgA
+ FdC4ABUvuABNELgANNC4ADQvuAAcELkAQAAG9LgAOdC4ADkvuABNELgARdC4AEUvuABNELgA
+ SNC4AEgvuABNELgAStC4AEovALgAUC+4AABFWLgAMS8buQAxAAg+WbsAAAABAAkABCu4ADEQ
+ uQAgAAH0QSEABwAgABcAIAAnACAANwAgAEcAIABXACAAZwAgAHcAIACHACAAlwAgAKcAIAC3
+ ACAAxwAgANcAIADnACAA9wAgABBdQQMABwAgAAFxQQUAFgAgACYAIAACcTAxATIeAhUUBisB
+ Ig4EBx4DFRQGFAYUBh0BFBYzMiwCNzYzMhYVFAcGDAIjIiY1ND4CNTQ+BDU0LgInLgE1NDcu
+ ATU0NjMyHgIXHgEXNz4DASIOBAcOBSMiLgI1ND4CMzI+Ajc+ATMyHgIVFA4CIyImNTQmA6gw
+ Yk8zHBGbKW56gHdpJQMEAwIBAgEcIHgBEwEXAQ10DQkLCRBx/vH+2f7Hm0tCCAkIAQECAQEC
+ AwUDDAoQAgMQCgYVFhQFAwUCHDSZpJoBrw0+UFpURRMTSFhgVkIPFxsNAwEIEQ8PTm+JS5DT
+ SyUwHAoMDw8DBg8IBPgNFyASEwoKEBQTEAUgQDszEw5MYm9kThHKJBQpSWM6BgwIEgtTglgu
+ QUIQKS0uFg86SlVRSRofWWhwNQYYERcQEzcRNS0SGyEOChgOBwkTDwr+ewsQFBMQBAQQExQR
+ CgwUFgsLEg0HFB0iDhwXCRIZEBAXDwcHDwsGAAABAPb/UgUSBScAXgC2uwATAAUAKwAEK0Eh
+ AAYAEwAWABMAJgATADYAEwBGABMAVgATAGYAEwB2ABMAhgATAJYAEwCmABMAtgATAMYAEwDW
+ ABMA5gATAPYAEwAQXUEDAAYAEwABcUEFABUAEwAlABMAAnG4ABMQuAAO0LgADi+4ACsQuAAm
+ 0LgAJi+4ABMQuABR0LgAUS8AuAAwL7gAPC+4AB8vugAOAB8AMBESObgAPBC5AEkAA/S6AFEA
+ HwAwERI5MDEBMhYVFAYHBgQjIi4CJw4BHAEVFB4EFRQOAiMiLgQ1PAE+ATc+AzMyHgIXPgUz
+ Mh4CFRQGIyI0LgEjIg4CBw4BBz4FNz4FBPYMEDsti/7blCFMSDwRAQEDBgUGAw8UFQYJEBAN
+ CQYDBAUBBAkOCwcTExEGImBsbl5FDS5KNRwUDwgEERlUr6aUOQUGAhE+TVZSSBoeW2dqWT8D
+ ZAcJDiMVQlUBBgwMKkFASDBPdVc9LiQRGiYaDAkgPGaWanLb2d1zFjQtHQ4WHA4IEA8NCgYe
+ LTUYGRQVGBUOFRkKb8JeChEQDQwKBAUPEREOCQABADn+JQUpBTcAZwGvuwAwAAUADwAEK7sA
+ VgAEAGUABCtBBQAaAGUAKgBlAAJxQSEACQBlABkAZQApAGUAOQBlAEkAZQBZAGUAaQBlAHkA
+ ZQCJAGUAmQBlAKkAZQC5AGUAyQBlANkAZQDpAGUA+QBlABBdQQMACQBlAAFxuABlELgAANC4
+ AAAvugADAGUAVhESObgAVhC5AD4ABfS5AFEABvS4AB/QuAAfL0EhAAYAMAAWADAAJgAwADYA
+ MABGADAAVgAwAGYAMAB2ADAAhgAwAJYAMACmADAAtgAwAMYAMADWADAA5gAwAPYAMAAQXUED
+ AAYAMAABcUEFABUAMAAlADAAAnG4AFYQuABb0LgAWy+4AFYQuABp3AC4AGAvuAAARVi4AAov
+ G7kACgAIPlm7ABoAAwAnAAQrugBOAEUAAyu6AAMARQBOERI5uAAKELkANQAC9EEhAAcANQAX
+ ADUAJwA1ADcANQBHADUAVwA1AGcANQB3ADUAhwA1AJcANQCnADUAtwA1AMcANQDXADUA5wA1
+ APcANQAQXUEDAAcANQABcUEFABYANQAmADUAAnG6AD4ARQBOERI5MDElPgE3DgUjIi4CNTQ+
+ CDMyHgIVFAYjIi4CIyIOBhUUHgIzMj4GNQ4FIyI1ND4EMzIWFRQOAhUUHgIVFA4CIyIuAjU0
+ NgSTBAkGNYmbpaCWPTBaRysvVHOGlpmXi3guFiwjFggNDAsNFRYujKa3sKB5RxUmNCA7jZaZ
+ jXtcNBRATFVTSx0tNldsbWMhMDINEQ0DBAMQGB0NDRILBQePLGQ1NWNXSDMdESxMOzB/kZ6g
+ nIx4VzEOHS0eDiAJCwlGd56wtqmRMiAjEQQdMkNOVVRPIhY1NTInFy8VQ01NPyctMxdinNeL
+ VGxLNBsQJB4UMlVwPk+hAAAAAAEAVP7uBV4FfwB8AOK6AFUAeAADK7sAOwAEAE0ABCtBGwAG
+ AFUAFgBVACYAVQA2AFUARgBVAFYAVQBmAFUAdgBVAIYAVQCWAFUApgBVALYAVQDGAFUADV1B
+ BQDVAFUA5QBVAAJduABVELgAD9C4AA8vuABNELgAFdC4ABUvuAA7ELgAKtC4ACovuAA7ELgA
+ LdC4AE0QuABQ0LgAUC+4AFUQuABd0LgAXS+4AFUQuQBuAAf0uABx0LgAcS+4ADsQuAB+3AC4
+ AGIvuAAARVi4ACAvG7kAIAAOPlm6AA8AYgAgERI5ugBxAGIAIBESOTAxAT4DMzIeAhUUDgIH
+ PgM/ATU0PgI3PgMzMh4CFRQGBwYVFBYdAT4DMzIWFRQOAgcRFA4CIyImNTQ3PgU1NCY1DgMH
+ DgMHMhYVFA4CIyIuAjU0PgQ3PgE3Bw4BIyImNTQ+AgEOEhsXFAsHGxsTDRQVCDR8g4U+VgUK
+ DQkMGhgVBwYNCwcYFQMFM0UtGQgvITBOZDQJEh0UNDIvAgMDAgEBAmWZhoNPBgcFAgEUDxcj
+ KRILDwoFAgMEBAMBAQQDRBkqDgwNHDFEAtWl4Yk7ERshERhZd5BRDh4cGwsPpCZWTkAQFh4R
+ BxMaHAkTEAYOHSZuQX8GBwQBCA4OFxUTCf2wHzYpFxsSHBUKNUlVVUwbL3A7FCMkJhdQpqKY
+ QxwXH1FJMhwqLxIMXYGViWwZFCwWFiMtJSsbKyMdAAEA9f+PAZ0FZAAiAI67ACAABAAQAAQr
+ QSEABgAgABYAIAAmACAANgAgAEYAIABWACAAZgAgAHYAIACGACAAlgAgAKYAIAC2ACAAxgAg
+ ANYAIADmACAA9gAgABBdQQMABgAgAAFxQQUAFQAgACUAIAACcbgAIBC4AADQuAAAL7gAEBC5
+ ABgAB/S4AAPQuAADLwC4ABUvuAALLzAxJTIWFRQGBw4DIyIuAjUQGgE2MzIWFRQGBw4DFRQW
+ AWoZFg8NBxYaGgsOEgkDDBUbDjAuDRcFBwQCAcE2JiJIGg8dFw8WOGBKAVIB2QEqiE1LI188
+ QZylpUlFcgAAAf/J/3EDMQVmADQAfrsADgAEACgABCtBBQAaACgAKgAoAAJxQSEACQAoABkA
+ KAApACgAOQAoAEkAKABZACgAaQAoAHkAKACJACgAmQAoAKkAKAC5ACgAyQAoANkAKADpACgA
+ +QAoABBdQQMACQAoAAFxuAAOELgANtwAuAAAL7sAIwADABMABCswMQEyHgIXHgcVFA4CIyIu
+ BDU0NjMyFhceATMyPgI1NC4ENTQmNTQ2ArgLGxsWBQMFBQUEAwMBH0VxUk+SgWpLKiARECoS
+ adiDLEMuFwQGCAYEAQgFZhkpNBsPU3iSmpiFZxxio3dCJz9QU0wdHSUYFXqEH0d0VV/OyLmV
+ ZxIRHg0gJQAAAAABAH//iwXFBRkAbQDWuwBkAAYATQAEK0EhAAYAZAAWAGQAJgBkADYAZABG
+ AGQAVgBkAGYAZAB2AGQAhgBkAJYAZACmAGQAtgBkAMYAZADWAGQA5gBkAPYAZAAQXUEDAAYA
+ ZAABcUEFABUAZAAlAGQAAnG4AGQQuAAw0LgAZBC4ADbQuAA2L7gATRC4AELQuABCL7gATRC4
+ AEbQuABGL7gATRC4AFLQuABSLwC4AAAvuABXL7gAOy+7ABoAAwAkAAQruAAaELgAHdC4AB0v
+ ugAwADsAVxESOboAZAA7AFcREjkwMQEyFRQOAgcOAwcOAwceBzMyNjMyFRQOAiMiLgQnLgMn
+ FRQWFBYVFA4CIyIuBD0BPAEvAS4BNTQ2Ny4DNTQ+AjMyHgIXHgEVFAcOARU+Azc+AwU9GQoU
+ GxFFs8LEVxg/PjMLCk10k6OropI5ER4KDyg1MwwaS1hfXVYhH2yCjD4BAQUNGRQLDwsGAwEC
+ PCIXOzgBAQEBBQwVDw8YExEJCAYbAwVbxdnvhRsjGBAFFB4LHyEhDTRlXVMkChwdGgkKJzI6
+ OjQpGAcNESwoHAkPFBYXCwooNTocCFqPcVUgIDcoFyQ7TlVVJlYZa0cfESoZIzIbRoZxURAg
+ KxkLFiUxHBcrETEXDmdEJExfeVAQGA8IAAEApv+yBNYFSgA6AJS7ACEABwAAAAQrQSEABgAh
+ ABYAIQAmACEANgAhAEYAIQBWACEAZgAhAHYAIQCGACEAlgAhAKYAIQC2ACEAxgAhANYAIQDm
+ ACEA9gAhABBdQQMABgAhAAFxQQUAFQAhACUAIQACcbgAIRC5AAUABfS6AA4AAAAhERI5uAAO
+ L7kAGAAH9AC4ABEvuwAkAAMANgAEKzAxNzQ+Ajc+BzU0NjMyHgIXFhUUBw4FBx4BMzI+BDc2
+ MzIVFAcOAgQjIi4Cpg8VGQkCBAUFBAQCAhkYDBMSEwwcLAMICAcHBQEPIA4zfoyTjoM2Ew0Q
+ GD2z3f7/jDxLKQ5UHi4gEwIvgZSem450Tw9FUxAdKBg2OUpBG4CowbqjNgUDEB0pMTgeCg4S
+ GUF0VzQaLTsAAQDR/0YFewW8AHwA6rsASgAHAFQABCu7ABIABwAhAAQruAASELgAGdC4ABkv
+ QQUAGgAhACoAIQACcUEhAAkAIQAZACEAKQAhADkAIQBJACEAWQAhAGkAIQB5ACEAiQAhAJkA
+ IQCpACEAuQAhAMkAIQDZACEA6QAhAPkAIQAQXUEDAAkAIQABcbgAEhC5ACsABPS4ACbQuAAm
+ L7gAKxC4ADDQuAAwL7oAMQAhABIREjm4AEoQuABE0LgARC+4AEoQuQBbAAX0uAASELgAftwA
+ uAAeL7gAAy+7AHAAAwA5AAQrugAxAB4AAxESOboARAAeAAMREjkwMQE+ATMyHgIVFAYHFB4E
+ FRQOBBUUDgIjIiY1ND4CNz4DNTQuAj0BDgEHDgMjIiYnLgMnLgEnDgMVERQOAiMiLgI1ND4E
+ Ny4BNTQ+AjMyFhceAxceAzMyPgI3PgM3PgEFJQgRDgYQDwoZFAIEBAQCAQMCAwEdJyYJEQ8F
+ BggDAwUDAQICAilbJh1DQzwVJUcZG0RGQxwRJBQCBAMCBwwSDAwhHhUJDxMSEQYUFwwVGg8a
+ GQ4FIC01GxtAPzYRIUlGPxcRPEVGGgsVBY8TGiAsLg0cTyITbJGkl3gcHFppb2JMERorIBEo
+ Hw9TZGAcIVReZjU/fnNkJTs/gTQpSDcgGAsMKzc+IBM4IEail3wg/kQXHhEGGzJFKgx3sdjZ
+ yEktShIYLyUXOzsWSFJWIyM6KhclNz4YE0pZWiMwQgAAAQDW/4cFDAWwAG0AP7sAOgAHAEMA
+ BCu4ADoQuQBIAAX0uABDELgATdC4AE0vALgAAC+4AD0vuwBhAAMAKgAEK7oAJwAqAGEREjkw
+ MQEyHgIVFA4EBw4HBx4BFRQOAiMiLgI1ND4CNw4BIyIuBCcuAyMiBhURFAYjIiYnLgE1ND4C
+ NS4DNTQ+AjMyHgIXHgMXHgMzMjY3PgU3PgEEywcXFA8FCQsLCgMDBwgJCQkHBwIPFg4WHhAT
+ GA4FAgUIBhY4KyNYXFxOPA4VKSUdBxALCxUXJQoOCgoMCg4SCgQCBw4LDx0bGgsLLE11VVRv
+ TDIXHCIMCBEPDgwKBAURBbASGx8MCDBCTk5IGxdffpWYk3xdFQkbEQwfGxItSV0xNUxMWkQX
+ IzJPYFtLExowJBUvI/v+FhEiMjyRVV/W5/V9IjgxLBYMFxILFyo4ISJUaYJPTlgqCSEcWo5x
+ XVNPLThBAAIAOf/4BR8E+gAgAEABYbgAQS+4AEIvuAAN3LgAQRC4ABnQuAAZL7kANAAG9EEh
+ AAYANAAWADQAJgA0ADYANABGADQAVgA0AGYANAB2ADQAhgA0AJYANACmADQAtgA0AMYANADW
+ ADQA5gA0APYANAAQXUEDAAYANAABcUEFABUANAAlADQAAnG4AA0QuQA+AAb0QQUAGgA+ACoA
+ PgACcUEhAAkAPgAZAD4AKQA+ADkAPgBJAD4AWQA+AGkAPgB5AD4AiQA+AJkAPgCpAD4AuQA+
+ AMkAPgDZAD4A6QA+APkAPgAQXUEDAAkAPgABcQC4AABFWLgAFC8buQAUAAg+WbsAAAADACEA
+ BCu4ABQQuQA3AAL0QSEABwA3ABcANwAnADcANwA3AEcANwBXADcAZwA3AHcANwCHADcAlwA3
+ AKcANwC3ADcAxwA3ANcANwDnADcA9wA3ABBdQQMABwA3AAFxQQUAFgA3ACYANwACcTAxATIW
+ FRQGFRQXHgMVFA4EIyIuAjU0Ejc+AxciDgIHDgEjIiYjIgYHDgMVFBYzMj4ENTQmBA42RQgK
+ GjUqG1KOv9flbjdnTzDByVGwoYQXFU9XURkWNhUFCwUTKR1Shl40PlFQxMm9lFlZBPokKgsS
+ CAgECiY+WT1fz8ezh1AcQWtQiwFZvEt6Vi+9EB8vHhopAx0YRJmalUBUWEuAp7m+Vk1dAAAC
+ AE7/WAUrBRIAMgBKAO64AEsvuABML7gACty4AEsQuAAm0LgAJi+5ABQAB/S4ABnQuAAZL7gA
+ JhC4ACrQuAAUELgAONC4ADgvuAAKELkAQgAG9EEFABoAQgAqAEIAAnFBIQAJAEIAGQBCACkA
+ QgA5AEIASQBCAFkAQgBpAEIAeQBCAIkAQgCZAEIAqQBCALkAQgDJAEIA2QBCAOkAQgD5AEIA
+ EF1BAwAJAEIAAXEAuAAeL7sAAAACAEUABCu7ADsAAwARAAQruABFELkABQAB9LgAERC4ABTQ
+ uAAUL7gAABC5AEoAA/S4ACvQuAArL7gAOxC4ADjQuAA4LzAxEzI+AjMyHgIVFA4EIyoBJx4D
+ FRQOAiMiLgQ1ESY1NDcRLgM1NDYXHgMXHgEzMj4ENTQmIyIOAgeBfeHLt1NskFckSX+pwc5k
+ FCsVAgQDAREbIhAKDgoFAwEXFx87Lx0a9gIEBAQDEikZW7mqlG0/b3dQoKKiUQThDxMPDyI3
+ KUSHfGtQLQJgv6F2FipCLRcNJkd2qncBGBknMQgBZAMWHB0KFhGoDz1XajwCAihBVFhWIhYZ
+ ExgYBQAAAAIAOf7dBiEFPQA9AHIBC7gAcy+4AHQvuAAF3LgAcxC4ACzQuAAsL7gABRC5AEoA
+ BfRBBQAaAEoAKgBKAAJxQSEACQBKABkASgApAEoAOQBKAEkASgBZAEoAaQBKAHkASgCJAEoA
+ mQBKAKkASgC5AEoAyQBKANkASgDpAEoA+QBKABBdQQMACQBKAAFxuAAsELkAYwAE9EEhAAYA
+ YwAWAGMAJgBjADYAYwBGAGMAVgBjAGYAYwB2AGMAhgBjAJYAYwCmAGMAtgBjAMYAYwDWAGMA
+ 5gBjAPYAYwAQXUEDAAYAYwABcUEFABUAYwAlAGMAAnEAuAAbL7sAAAABAE0ABCu7AGYAAQAn
+ AAQruABNELkANQAD9LgAVdwwMQEyHgIVFA4EBx4DFx4DFRQOAiMiLgQnDgMjIi4CNTQ+BjMy
+ FhUUBhUUFgEyHgIXPgU1NCYjIg4CBw4BIyIuAiMiDgYVFBYzMj4CNy4BNTQ+AgWPFjMsHS5T
+ dIqdUy1dUkITHDcsGxMeJRMQP1FcWlIeTJmTiT08UjMWU4270NrLsD4cLgsL/YkLGRkYC06W
+ hnFSLkA7HVdaURcuPBQTDwUDBwZBZHt/eV45OD8ub3yERA4ZAgkQBOMaMUgtPIWJi4Z+OD5w
+ XEUTHCwiGAcOGhUNM1Nqb2sqLUo0HBoySC1bw8K8p45nOhIUCxUIBQf8+BEaIRA1dXp6c2cq
+ KCYXISQNGikTFhMrTGd3gYB7NEIzGzFFKRk2DgkWEw0AAAACAHf/PQUbBUgAWABsAXe7AD8A
+ BwBUAAQruwAYAAUAYwAEK0EhAAYAPwAWAD8AJgA/ADYAPwBGAD8AVgA/AGYAPwB2AD8AhgA/
+ AJYAPwCmAD8AtgA/AMYAPwDWAD8A5gA/APYAPwAQXUEDAAYAPwABcUEFABUAPwAlAD8AAnG4
+ AD8QuQBRAAf0uAAA0LgAAC+4AFEQuAAD0LgAAy+4AFEQuAAI0LgACC+6AA4AVAA/ERI5uAA/
+ ELgAJNC4ACQvuAA/ELgAJ9C4ACcvuABRELgATtC4AE4vuAA/ELgAXtC4AF4vQQUAGgBjACoA
+ YwACcUEhAAkAYwAZAGMAKQBjADkAYwBJAGMAWQBjAGkAYwB5AGMAiQBjAJkAYwCpAGMAuQBj
+ AMkAYwDZAGMA6QBjAPkAYwAQXUEDAAkAYwABcbgAGBC4AG7cALgACy+4ABMvuABJL7sALQAD
+ ADwABCu4ABMQuQBoAAP0ugAOABMAaBESOboAPwA8AC0REjm6AF4ASQALERI5MDETNDY1NC4C
+ NTQ2MzIWFz4DMzIeAhUUDgIHDgUHFhQdAR4DMzI+AjMyFRQGBw4DIyImJx4DFRQOAiMiLgIn
+ LgE1LgE1ND4CEx4DFzYkPgE1NC4CIyIOAvYBAwUDChITFwkbWW9+QU+RbkIJGSohLG14fXdr
+ KgIxaHqWYFCMa0QIFxkWGFt2ikaF6FkCBwYFEBkeDQ0TDggBAgRCNxwnLGwCBQUEAqgBAa5Z
+ N1JgKUCAcl8CnhcwGFWqj2UQKh46MxAkHxQiQmFADSImKRUcOzw7NS8SGzEUDCw9JhEeJR4Z
+ ER8SFC4oG0A7P4t5WQwSKCEWPFhjJje0ZzxLGwwXFhEBnSBVX2QwSHtiSBQYJhsPECAxAAAA
+ AAEATv/bBZEFRgBaAX24AFsvuABcL7gAWxC4ACzQuAAsL7gAXBC4ACDcugAWACwAIBESObgA
+ LBC5ADIABfRBIQAGADIAFgAyACYAMgA2ADIARgAyAFYAMgBmADIAdgAyAIYAMgCWADIApgAy
+ ALYAMgDGADIA1gAyAOYAMgD2ADIAEF1BAwAGADIAAXFBBQAVADIAJQAyAAJxuAAgELkAPgAF
+ 9EEFABoAPgAqAD4AAnFBIQAJAD4AGQA+ACkAPgA5AD4ASQA+AFkAPgBpAD4AeQA+AIkAPgCZ
+ AD4AqQA+ALkAPgDJAD4A2QA+AOkAPgD5AD4AEF1BAwAJAD4AAXEAuAAARVi4ACcvG7kAJwAI
+ Plm7AAAAAQANAAQruwAbAAIAQwAEK7gAJxC5ADcAAfRBIQAHADcAFwA3ACcANwA3ADcARwA3
+ AFcANwBnADcAdwA3AIcANwCXADcApwA3ALcANwDHADcA1wA3AOcANwD3ADcAEF1BAwAHADcA
+ AXFBBQAWADcAJgA3AAJxMDEBMh4CFRQOAiMiJjUOBwc+AzMyHgIVFA4EIyIuAjU0NjMyFhUU
+ HgIzMj4ENTQuAiMiDgQjIi4CNTQ+BDc+AwTVFSwmGBEdKRgPEx5ujqSjm31VDHf86cM+YH9N
+ H1uayd7jZkmAXjcZDw4YHkFnSGXWzbaKUCVCWzZCrbq5m3AUEBwUDCdGYnWGSHbIl2IFRhIa
+ GwkFGRoUDhECIzpOWF1bUyEbLR8RLUtkNj+CempQLiI/WTYUICgzCh4bEzNTam5pKBcrIBMU
+ HiMeFA4jOCoTPEtVV1QlPU4tEQAAAAAB//7/dwUOBWAARwCYuwAhAAcALgAEK0EhAAYAIQAW
+ ACEAJgAhADYAIQBGACEAVgAhAGYAIQB2ACEAhgAhAJYAIQCmACEAtgAhAMYAIQDWACEA5gAh
+ APYAIQAQXUEDAAYAIQABcUEFABUAIQAlACEAAnG6ADMALgAhERI5ALgAAC+4ACkvuwA+AAMA
+ NgAEK7oACAApAAAREjm6ADMANgA+ERI5MDEBMh4CFRQGBz4DNz4DMzIWFRQOBAcOAxUUHgIV
+ FAYjIi4CNTQ+AjcOASMiLgI1NDYzMj4CNz4DApEPEwsFAQEqV1FHGjZROicLFxBGbomHdyUF
+ BgMCFhsWEBkYODIhBAYKBme4Ry1LOB8gHS51h5VOBxITEwVgHjA7HBAdDQoVFBIHDhgSCw0R
+ EzU7OzEjBT2Kgm0fc8eaZREbKlCg7Z4wb3Z5OhodGSImDBgVCxMbEDZcQiYAAAABANn/vATP
+ BYEAUgFvuwAMAAYARQAEK7sALwAHACcABCtBIQAGAAwAFgAMACYADAA2AAwARgAMAFYADABm
+ AAwAdgAMAIYADACWAAwApgAMALYADADGAAwA1gAMAOYADAD2AAwAEF1BAwAGAAwAAXFBBQAV
+ AAwAJQAMAAJxugBOAEUADBESObgATi+5AAMABPRBBQAaACcAKgAnAAJxQSEACQAnABkAJwAp
+ ACcAOQAnAEkAJwBZACcAaQAnAHkAJwCJACcAmQAnAKkAJwC5ACcAyQAnANkAJwDpACcA+QAn
+ ABBdQQMACQAnAAFxugAdACcALxESObgAHS9BBQAaAB0AKgAdAAJxQSEACQAdABkAHQApAB0A
+ OQAdAEkAHQBZAB0AaQAdAHkAHQCJAB0AmQAdAKkAHQC5AB0AyQAdANkAHQDpAB0A+QAdABBd
+ QQMACQAdAAFxuQA5AAb0uABU3AC4AABFWLgAKi8buQAqAA4+WbsAEQADAEAABCswMQEyFhUU
+ DgYVFB4CMzI+BDc+AzU0LgQnLgE1NDYzMh4CFRQGBx4FFRQOBCMiLgI1ND4GNT4DAVAiJAcL
+ Dw8OCwcRK0g2LWVmZFZFFSAjEAMLEhYVEwUIDBYfFiEWCwMFBRIVFRALSXqfrK1LUF8yDwYJ
+ DA0MCQcBAwsTBQ5LWw1Nb4mPj3xgGiU1IxALExgbGgwSMT1FJh1gdX95aCMyaC0wPjNPXioa
+ LhAdZ4OYm5dAQGVLNCAOMFRzQxljg5ialHlVDx4sHQ8AAQA1/2IEnAW8AE0AFQC4ABwvuAA2
+ L7oADgA2ABwREjkwMRMyHgIXHgcXPgU3PgUzMh4CFRQOBgcOBRUUDgIjIi4CJy4HJy4DNTQ+
+ AlIVMTEuEQgcIygqKSYgCwMcKC8uKA0ZQ0pLQTELDBYPCRUkMDQ2MCgNEy0wLSMVCRUmHB0d
+ Eg0LBiAuNzo3LyEGDBkTDAEFDAT+M1BgLRdUboGIiHxpJBZVandvXx05oKyrhlQUIi4ZDUFb
+ cHZ4bFoeLGhvbmRVHDZDJQ4dMkMlEmaPrLCoiFwMGC4oHwkJHBsUAAABADr/lgeoBYMAfQA3
+ uwAOAAUAcAAEKwC4ADwvuABTL7gAbC+6AA4AUwA8ERI5ugAuAFMAPBESOboAYgBTADwREjkw
+ MRMyHgIXHgcXPgc3PgMzMh4CFRQOAgceARceAxc0PgY3PgMzMhYVFA4CBw4FBw4DFRQGIyIu
+ AicuAycuAycOAQcOAwcGIyImPQE0LgYnJjU0NmQPEg8PCwUiLzg6NisbAgQsQlFVUkMuBhMd
+ GRkRChYSCyM6TCoJMy8VKCYjDy9NZGxqWkENGSEXFAwUExsmKAweTFRYUkgbGiEUBzIqEBQO
+ DAcJHiYsFw8iJCIOGjIWJTwyJw8lQyATGy46PTwxIQQKFgUxCxooHQ9UepagoI5zIxpnhZqa
+ knZPCiFDNCEQGyQUHmB4ikhCnFooSEdJKSmAmqyroYRfEyc5JxMaHxxKS0ITL3aFj4+KPTxy
+ X0cQHxwSHigWHFFdZC4cRUxPJy5YKERtZGI5iSEojCB7nre3rYpdDB4bHSMAAAABADv+/ARg
+ BdkATwAfALgAFC+4AD0vugAKAD0AFBESOboANQA9ABQREjkwMRMyHgIXHgMXPgM3PgMzMhUU
+ BgcOAwceAxceAxUUDgIjIi4CJy4BJw4BBw4DIyImNTQ2NzYSNy4BJy4DNTS2BxggJxULLD1M
+ Kj56cGMnFRwXFQ8nERoeX3WIRilVVVMmHDgtHAgOEwwRNDs+GVOKQlGaQi0tGhUVDh8gKkKz
+ YSxcNB0wIhQFIR0yQycUSWF2QFGelo5BJTYkEk4yUS81hp+zYj16dW0vI0Q7LAsIExALMEZR
+ IWrEZ3P0gFVzRx5APDOIVoYBDoNIoF0yYlA3BhsAAAAAAQAd/vAFTAVmAEsAhrsAOgAHAEEA
+ BCtBIQAGADoAFgA6ACYAOgA2ADoARgA6AFYAOgBmADoAdgA6AIYAOgCWADoApgA6ALYAOgDG
+ ADoA1gA6AOYAOgD2ADoAEF1BAwAGADoAAXFBBQAVADoAJQA6AAJxuAA6ELkAAAAE9LgAOhC4
+ ADPQuAAzLwC4ACQvuAA/LzAxAS4FNTQ2MzIeAhceAxceATMyNjc+Azc+AzMyFhUUDgQHDgMH
+ FA4EFRQOAiMiNTQ3PgY0AmI9hYF1WTQWFw4VExMNLVhhb0QXKRMiOiQ9a1lJHSI3LCMODBcn
+ PUtJQBITQ1BWJwICBAICGSQnDyQOBAcEBAICAQLDDkdhc3NrKhgTBxAZEj9qXFAkDAoaGSpd
+ WE4bIDkrGRAfCjZHUk5BExRDSEASFG2QpZuAIzZWPB9AJkAUUWx+g4FuVQAAAQAK/2IGjgUz
+ AIkAzQC4ACkvuAB1L7gAAEVYuABnLxu5AGcACD5ZuwBRAAMAbgAEK7sAIgADAA4ABCu7ADwA
+ AQBLAAQruAA8ELgABdC4AAUvugALAA4AIhESObgASxC4AE7QuABOL7gAZxC5AFYAA/RBIQAH
+ AFYAFwBWACcAVgA3AFYARwBWAFcAVgBnAFYAdwBWAIcAVgCXAFYApwBWALcAVgDHAFYA1wBW
+ AOcAVgD3AFYAEF1BAwAHAFYAAXFBBQAWAFYAJgBWAAJxuABLELgAgtC4AIIvMDETMh4CFz4B
+ Nz4BNw4BIyIuAicuAzU0NjMyHgQzMj4EMzIeAhUUBgcOAwcOAwczMiQ+ATMyFhUUDgQjIiYn
+ DgEHMh4CMzI+Ajc2MzIVFAYHDgMjIi4EIyIOBCMiJjU0PgI3PgM3LgM1NDbHDURrkVk/ZRwt
+ dDI+gzstd3hqICApGAkxKw4dK0JolWlDl5SKbkoKDx0VDU1CWZV6YSUPMj9JJ07BAQipVg8d
+ FDpoj6m9YjJgLz9wJjubsL1fXJh8ZiobDxIXGTd9f3cxOoyTlINsIiE6NTExMxwaIDNHSxgM
+ Ok9eMFaSazwqApgKDg8ESnojOG0qDRADCA0JCRIVGREgMAkOEA4JGCMqIxgTHB8MJiULDj5M
+ UiIONUhWLh4jHhgiCyEkIxwSAQNMhysuOC4KFSEYDxAMJRUvOyELFiImIhYoPEU8KCErIkZE
+ PBgMQFptOQgWGBkLHScAAQDb/mQELQXuAFIAsLsANwAGAAMABCu4AAMQuAAA0LgAAC9BIQAG
+ ADcAFgA3ACYANwA2ADcARgA3AFYANwBmADcAdgA3AIYANwCWADcApgA3ALYANwDGADcA1gA3
+ AOYANwD2ADcAEF1BAwAGADcAAXFBBQAVADcAJQA3AAJxugAMAAMANxESObgADC+5ACsAB/S4
+ ACjQuAAoL7gAKxC4AC7QuAAuLwC7ADwAAwBOAAQruwAWAAMAIwAEKzAxFzQ2Nz4DEj4CNTQ2
+ Mz4FMzIeAhUUBiMiNi4BIyIOAgceARUUBgcOBwceAzMyPgI3NjMyFhUUBgcOAyMiLgLbAgIC
+ BQUGBQUDAhgZFlt0fm5TDy5KNRwTEAgBBBEZTqKcjjoBAgMEAgYHCAgHBwUBBB0lJg9jlIB7
+ SQUKDg4SEzaFnbJiPUspDvoNFwkbldH8AQL3yIYRRVMHEhEQDQceLTUYGRQUGRQLEhYKFB0S
+ EC0kFG2fxNXZyKw9ERcOBggSHhYCEw4QIgkaNy0cGi07AAAAAAEACP8MBEIFWgAoAAsAuAAY
+ L7gAAC8wMRMyHgIXHgcXHgMVFA4CIyIuAicuAQoBJy4DNTQjBhghJxUMO1VpdHt2bi4cOS0c
+ CA8TDBA0PD4ZUa+vrE8dMCIUBVodMkMmFWGIpbK3q5c5JEQ6LAsIExALMEZRIWr/ARUBIYwy
+ YlA2BhsAAAEAqP59A98FwwBMAD+7ABgABgBAAAQruABAELgARtC4AEYvuAAYELgATtwAuwA4
+ AAMAIgAEK7sADQADAEYABCu4ACIQuQAxAAP0MDETIiY1NDY3PgUzMh4CHQEOAxUUDgIHDgMj
+ Ii4CJy4DNTQ+AjMyHgQzMjY3PgM9ATQ+AjciDgTvDw8JCRZbdH5vUw8ySzIZBQYFAgQIDQgK
+ JTxWOzBzb2AdJS8bCgcRHhgVR1hhXlUfDRQIGyMUCAECBAM8ioqBZUAE9iwaFCIDBxIREA0H
+ Ii4yEAaD7OTke0COko0+S1QpCQUICQUGDhASCQ4kIRYFBgkGBQEBBEuFuXPxXtXWzFYLEBMQ
+ CwAAAAABAAcBoANCBe4ARQBwuwA0AAcALAAEK0EhAAYANAAWADQAJgA0ADYANABGADQAVgA0
+ AGYANAB2ADQAhgA0AJYANACmADQAtgA0AMYANADWADQA5gA0APYANAAQXUEDAAYANAABcUEF
+ ABUANAAlADQAAnEAuAAaL7gAMS8wMQEiJicuBScuASMiBgcOBQcOASMiJjU0Njc+BTc+AzU0
+ PgIzMhYVFB4CFx4FFx4BFRQGAx0ZIA8FJzlDPzQODhMIDRAKBRojJyUgCh07JQ0TDA4KHSEk
+ Ih8LCx4cExwmJwoTCgcOFAwILTxEPjMNDQwTAdsuPxNRaHNpUxUUEiUXDEljc2xbGUtMHRoS
+ LRsTTGBrZlcdHExOSRoZODAfPisVKCgtGhFQaHZvXRwcQR4mNgAAAQAm/vwEgP/RACIAOwC4
+ AABFWLgACi8buQAKAAg+WbgAAEVYuAANLxu5AA0ACD5ZuwAFAAMAGgAEK7gABRC4AADQuAAA
+ LzAxFzIeAjMyPgI3PgEzMhYVFAYHDgUjIi4CNTQ2M2YIHSMlEV/U4OVwBQoEEg8UDjSQpK6l
+ kTUnQzEcGRp9AQIBDhYdDwEBDgoOHQcZKR8WDgYVHyUQDhAAAAEAxgQUA4MGFAAiAAsAuAAD
+ L7gAFC8wMRM0NjMyHgIXHgUXHgEVFCMiJicuBScuA8YRDgoYISobC0lhbmNKDR4bEw4jEghG
+ Y3VwXxsaIhQHBeETIBIdJhMILTtDPC8JFzESFxMOBiY2QD86FBMkIBsAAAAAAgA1/7IEpAQE
+ ADsAVAE3uwBMAAQAMwAEK7sAFQAEACkABCtBBQAaACkAKgApAAJxQSEACQApABkAKQApACkA
+ OQApAEkAKQBZACkAaQApAHkAKQCJACkAmQApAKkAKQC5ACkAyQApANkAKQDpACkA+QApABBd
+ QQMACQApAAFxuAApELkADAAH9LoABgApAAwREjm4ABUQuAAS0LgAEi+4ACkQuAA80LoAPwAp
+ ABUREjlBIQAGAEwAFgBMACYATAA2AEwARgBMAFYATABmAEwAdgBMAIYATACWAEwApgBMALYA
+ TADGAEwA1gBMAOYATAD2AEwAEF1BAwAGAEwAAXFBBQAVAEwAJQBMAAJxuAAVELgAVtwAuAAA
+ L7gAIi+7AE4AAgAuAAQrugAGACIAABESOboAKQAiAAAREjm6AD8AIgAAERI5MDEBMhYVFAYH
+ NjIzMhYVFAYHBhQVFBYVFB4EFx4BFRQGIyIuBCcOAyMiLgI1ND4GAz4BNy4BIyIGBw4FFRQz
+ Mj4EA/QoJgMCBw4IJSU8NQEBCA4SExIHBQMbGg0fISEbEwRRxMzIVSMyIhA6Y4aXopyPAgMd
+ IgYMBgwYDk+wrJx3RicfZoCQkIgEBB0mCg8GAiAaNINLBw4IDx4OHE1XXVZJGQ4cDSMvNVlz
+ enkzV6J9TBgqNyA5ho2Pg3JUMP5gVZAsAQEDBRlmgpSOfSslID1WbH8AAAAAAgBs/6oE0QY7
+ AEQAWAFruABZL7gAWi+4AFkQuABA0LgAQC+5AAoABPRBIQAGAAoAFgAKACYACgA2AAoARgAK
+ AFYACgBmAAoAdgAKAIYACgCWAAoApgAKALYACgDGAAoA1gAKAOYACgD2AAoAEF1BAwAGAAoA
+ AXFBBQAVAAoAJQAKAAJxuAAF0LgABS+4AFoQuAAU3LgAQBC4ACLQuAAiL7gAQBC4ACvQuAAr
+ L7gAQBC4ADXQuAA1L7gAQBC4ADjQuAA4L7gAQBC4AD3QuAA9L7oARQBAAAoREjm4ABQQuQBM
+ AAX0QQUAGgBMACoATAACcUEhAAkATAAZAEwAKQBMADkATABJAEwAWQBMAGkATAB5AEwAiQBM
+ AJkATACpAEwAuQBMAMkATADZAEwA6QBMAPkATAAQXUEDAAkATAABcbgAChC4AFTQALgAAC+4
+ ACIvuwAPAAEATwAEK7oACgAiAAAREjm6ACsAIgAAERI5ugBFACIAABESOTAxEzIeAhceAxc+
+ AzMyHgIVFA4GBw4DIyImNTQ2Nz4BNwcGIyIuAjU0NzY0NTQuAjU0JjU0PgITPgU1NCYjIg4C
+ Bw4D7BMbEQkDAQMDAwFJsb29VDhMLxQyVXOBiYR3Lik8LycUFxEFBAwQAy8CBQgSDwpvAQMF
+ AwIDBgtMQrC8tpBYLCBlzsSwRgEDBAYGOylCUScYcJq4YSRGOCIUKkEtK2BnamllXFEhHTYo
+ GCsjG0MjfedrIQIUHB4LIkUoTCRgnnpREhYtFxsyJRf6Tit5iI6AaSAUEyxEUydKkYZ0AAAA
+ AAEANf/jBEIEEAA2AOK7ABMABwAwAAQrQSEABgATABYAEwAmABMANgATAEYAEwBWABMAZgAT
+ AHYAEwCGABMAlgATAKYAEwC2ABMAxgATANYAEwDmABMA9gATABBdQQMABgATAAFxQQUAFQAT
+ ACUAEwACcQC4AAAvuAACL7gAAEVYuAAtLxu5AC0ACD5ZuQAYAAH0QSEABwAYABcAGAAnABgA
+ NwAYAEcAGABXABgAZwAYAHcAGACHABgAlwAYAKcAGAC3ABgAxwAYANcAGADnABgA9wAYABBd
+ QQMABwAYAAFxQQUAFgAYACYAGAACcTAxATYzMhYVFA4EBw4FFRQeAjMyPgQ3NjMyFRQGBw4F
+ IyImNTQ+BANaLBoZHilBUlJKGShdX1hDKQoXIxlAiYqIfnEvFQ4LFBUoZniIlqJVZmNNf6az
+ swQCDhkXGTIxLiYcCBlRY29vaywPHRcNIz1SXGMvFhAOLhoyamVaRChfZFa2r6KFYgAAAAAC
+ ADX/gQSzBkgAPgBXAce7AFUABwA4AAQruwAaAAUAAwAEK0EFABoAAwAqAAMAAnFBIQAJAAMA
+ GQADACkAAwA5AAMASQADAFkAAwBpAAMAeQADAIkAAwCZAAMAqQADALkAAwDJAAMA2QADAOkA
+ AwD5AAMAEF1BAwAJAAMAAXG4AAMQuAAI0LgACC+4AAMQuAAL0LgACy+4AAMQuQATAAb0uAAd
+ 0LgAExC4AB/QuAAfL7gAAxC4ACzQuAAsL7gAAxC4AEbQuABGL7gAAxC4AEnQuABJL0EhAAYA
+ VQAWAFUAJgBVADYAVQBGAFUAVgBVAGYAVQB2AFUAhgBVAJYAVQCmAFUAtgBVAMYAVQDWAFUA
+ 5gBVAPYAVQAQXUEDAAYAVQABcUEFABUAVQAlAFUAAnG4ABoQuABZ3AC4AA4vuAAkL7gAAEVY
+ uAAzLxu5ADMACD5ZuwAAAAEATAAEK7oAAwBMAAAREjm6ACwAJAAOERI5uAAzELkAPwAB9EEh
+ AAcAPwAXAD8AJwA/ADcAPwBHAD8AVwA/AGcAPwB3AD8AhwA/AJcAPwCnAD8AtwA/AMcAPwDX
+ AD8A5wA/APcAPwAQXUEDAAcAPwABcUEFABYAPwAmAD8AAnEwMQEyFhc+AzU0JjU0NjMyHgIV
+ FA4EFRQSFxYVFA4CIyIuAjU0NjcOBSMiLgI1ND4EATI+BDc+ATcuASMiDgYVFBYDfUdZGgME
+ BAIEDxUPGxUNBAYHBgQMDwMTHSEOEREJAQECHV12iZKURlFqPhhdlbq7qP4IOXyCgn52NAID
+ AxVCMClseH53aU4uOwOLFhFgtJl2ISczEyATHTVMLxphgp6vulyM/v9nEhAhMSERHDtbPyuB
+ TBlMVlZFKyI7UC1QqJ6MaT38yyA3SE9RJU6ZVwsUJD9TXWReVSA4PwAAAAIANf/jBGIDvgA0
+ AEUBkbgARi+4AEcvuAAF3LgARhC4AC7QuAAuL7gABRC4ACLQuAAiL7oADwAuACIREjm4AC4Q
+ uQARAAf0QSEABgARABYAEQAmABEANgARAEYAEQBWABEAZgARAHYAEQCGABEAlgARAKYAEQC2
+ ABEAxgARANYAEQDmABEA9gARABBdQQMABgARAAFxQQUAFQARACUAEQACcbgABRC4ABvQuAAb
+ L7oANQAuACIREjm4AAUQuQA8AAX0QQUAGgA8ACoAPAACcUEhAAkAPAAZADwAKQA8ADkAPABJ
+ ADwAWQA8AGkAPAB5ADwAiQA8AJkAPACpADwAuQA8AMkAPADZADwA6QA8APkAPAAQXUEDAAkA
+ PAABcQC4AABFWLgAKS8buQApAAg+WbsAAAACAD8ABCu4ACkQuQAWAAP0QSEABwAWABcAFgAn
+ ABYANwAWAEcAFgBXABYAZwAWAHcAFgCHABYAlwAWAKcAFgC3ABYAxwAWANcAFgDnABYA9wAW
+ ABBdQQMABwAWAAFxQQUAFgAWACYAFgACcTAxATIeAhUUDgQjIiYnBhUUHgIzMj4CNzYzMhUU
+ BgcOBSMiLgI1ND4EAT4FNTQmIyIOBAN5NEouFliOsLGeNR0nBh8XNFU+Wbatn0IZDAoPDx5W
+ aHmCikU+gWhCVImxurT9y1qzo4xnOikjLG96fnVlA74VJTIdMWpkWUMnJBdGQSM/LxswUGo7
+ Fg0LJRMmV1ZPPSQeQ21PXbCcgl80/jATNj1BPDUTER4aMERUYgAAAAABABf/vANGBnkATgFT
+ uABPL7gAUC+4AE8QuAAF0LgABS+4AFAQuAAR3LkAHgAG9EEFABoAHgAqAB4AAnFBIQAJAB4A
+ GQAeACkAHgA5AB4ASQAeAFkAHgBpAB4AeQAeAIkAHgCZAB4AqQAeALkAHgDJAB4A2QAeAOkA
+ HgD5AB4AEF1BAwAJAB4AAXG4AAUQuQAoAAf0QSEABgAoABYAKAAmACgANgAoAEYAKABWACgA
+ ZgAoAHYAKACGACgAlgAoAKYAKAC2ACgAxgAoANYAKADmACgA9gAoABBdQQMABgAoAAFxQQUA
+ FQAoACUAKAACcbgANNC4ACgQuAA50LgAOS+4AAUQuABD0AC4AD4vuwAMAAIAIQAEK7sALQAD
+ AEcABCu4AEcQuQAoAAP0uAAA0LgAAC+4ACgQuAAF0LgABS+4AAwQuAAW3LgARxC4ADTQuAA0
+ L7gARxC4AETQuABELzAxEz4DNz4FMzIeAhUUDgIjIiY1NDc+ATU0JiMiDgQHPgMzMhUUDgIH
+ FB4CFRQOAiMiLgI9AQ4BIyIuAjU0NloPITRMOgUjNkRKTSUiOy0aChckGhAYBAgLDxMcNzQt
+ JBgDSWNCKRA7JlSHYQQEBAUQHxoVFwwDIDkYNUgsEyQDPwECAgICnfS2fEwiITA4FxhEPywV
+ EwsLF0EeICwYPWie2pEDCAgFPRcjGhAFZMKpiCoaLyMVYaLQb7wCAgkSHBMfHgAAAAIAJf1U
+ A6ID0wBEAFkBJrsAVwAGAD4ABCu7AA8ABwBMAAQruAAPELkALQAH9LoAMgBMAA8REjlBIQAG
+ AFcAFgBXACYAVwA2AFcARgBXAFYAVwBmAFcAdgBXAIYAVwCWAFcApgBXALYAVwDGAFcA1gBX
+ AOYAVwD2AFcAEF1BAwAGAFcAAXFBBQAVAFcAJQBXAAJxuAAPELgAW9wAuAAAL7gAAEVYuAAW
+ Lxu5ABYACj5ZuwBFAAIAOQAEK7gAFhC5ACgAAfRBIQAHACgAFwAoACcAKAA3ACgARwAoAFcA
+ KABnACgAdwAoAIcAKACXACgApwAoALcAKADHACgA1wAoAOcAKAD3ACgAEF1BAwAHACgAAXFB
+ BQAWACgAJgAoAAJxugAyABYAABESOboATQAWAAAREjkwMQEyHgIVMh4CFx4DFRQOBCMiLgIn
+ JjU0NjMyFhceAzMyPgESNTQuAicOBSMiLgI1ND4EATI+BD0BDgEHDgUVFBYCqhkkFQoNFBAP
+ CAccHBUfOlRqf0dFemRKFB8UEREhDRJNXmQpOnVdOgcLDgcYTV5pamUqLDojD015k4xz/lIl
+ Z3BvVzYMHxI5eHFlSywgA9MPFx0PCxkoHBlZisF/Ws3JuI1ULUFKHSsmEhgZFBw+NSNxwwEF
+ lTR0dXEzNG1mWkMnGyw5Hl6umH1aMf0dM1VyfYE7LQQJBhNCVGFkYCkvJwAAAQDE/6MD1QYz
+ AEcBTrgASC+4AEkvuAAF3LkAFAAF9EEFABoAFAAqABQAAnFBIQAJABQAGQAUACkAFAA5ABQA
+ SQAUAFkAFABpABQAeQAUAIkAFACZABQAqQAUALkAFADJABQA2QAUAOkAFAD5ABQAEF1BAwAJ
+ ABQAAXG4AEgQuAAv0LgALy+5AEMABvRBIQAGAEMAFgBDACYAQwA2AEMARgBDAFYAQwBmAEMA
+ dgBDAIYAQwCWAEMApgBDALYAQwDGAEMA1gBDAOYAQwD2AEMAEF1BAwAGAEMAAXFBBQAVAEMA
+ JQBDAAJxuAAc0LgAHC+4AEMQuAAh0LgAIS+4AEMQuAAk0LgAJC+4AC8QuAAq0LgAKi+4AC8Q
+ uAA20LgANi+4AEMQuAA80LgAPC8AuAA5L7gAJy+4AABFWLgADC8buQAMAAg+WbsAAAADABcA
+ BCu6AEMAJwA5ERI5MDEBMh4CFRwBDgMjIi4CNTQSNTQmIyIOAgcUHgIVFAYVDgEjIiY1ND4C
+ NTQuBDU0NjMyFhUUHgQXPgMDHStEMBkDBQkOCgsYFQ4POjkzenxzKwEBAQEDLBUUIQQEBAEC
+ AwIBEx4fGgEBAQICASxygIYD3xxKf2RHmZOEZDsGEiIcQQEf4FFEKENWLUWDdGEkHikIQkge
+ KQopWpx+ae7s26xuCis1RzgJQ2iIm6lVMFxILAACAKb/7gF/BaAAHQArAKm7ACEABwAnAAQr
+ QQUAGgAnACoAJwACcUEhAAkAJwAZACcAKQAnADkAJwBJACcAWQAnAGkAJwB5ACcAiQAnAJkA
+ JwCpACcAuQAnAMkAJwDZACcA6QAnAPkAJwAQXUEDAAkAJwABcboAGQAnACEREjm4ABkvuQAF
+ AAf0uAAZELkACgAH9LgAD9C4AA8vALgAAEVYuAAULxu5ABQACD5ZuwAeAAMAJAAEKzAxATIe
+ AhUUDgIVFB4CFRQOAiMiLgI1NBI+ARMyFhUUBiMiJjU0PgIBAA0hHhQICwgDAwMFDx0XFRkP
+ BQUNGDctLUU2LjASIi4DthUgJxILXYadS2F5SCMJDBQOCCI9VjOjAQ/DawHqOyw5QjcwFywj
+ FQAAAAAC/yv9xQGNBaAAOgBIAJK7AAcABwBEAAQruAAHELkALAAG9LgABxC4AD7QuAA+L0EF
+ ABoARAAqAEQAAnFBIQAJAEQAGQBEACkARAA5AEQASQBEAFkARABpAEQAeQBEAIkARACZAEQA
+ qQBEALkARADJAEQA2QBEAOkARAD5AEQAEF1BAwAJAEQAAXEAuwAlAAMAEQAEK7sAOwADAEEA
+ BCswMQEyHgQVFA4CBw4DIyImJy4DNTQ+AjMyHgQzMj4ENTQuBDU0JjU0PgITMhYVFAYjIiY1
+ ND4CARIcJhkOBwEECAwJCBooNyVKhEolLxsKBQ4WEgwvPUVEPhcWHxQLBgEGCAsIBgECCA4s
+ LS1FNi4wEiIuA8tXiquqlzBBkpeTQD5PLhEbFgoVFBMKCSAgFwkPEA8JOl13eXEqIm6BiXld
+ FhQrFRUnHBEB1TssOUI3MBcsIxUAAQCk/5YEBAZkAFkA6LsASwAFAEAABCtBIQAGAEsAFgBL
+ ACYASwA2AEsARgBLAFYASwBmAEsAdgBLAIYASwCWAEsApgBLALYASwDGAEsA1gBLAOYASwD2
+ AEsAEF1BAwAGAEsAAXFBBQAVAEsAJQBLAAJxuABLELgAJNC4ACQvuABAELkAKQAH9LgAQBC4
+ AC/QuAAvL7gAQBC4ADTQuAA0L7gAQBC4ADrQuAA6L7gAQBC4AD3QuAA9L7gASxC4AEjQuABI
+ L7gASxC4AE7QuABOLwC4AEUvugASACwAAyu4ABIQuAAV0LgAFS+4ABIQuQAcAAH0MDEBMhYV
+ FAYHDgMHHgUzMjYzMhUUDgIjIi4CJy4BJx4DFRQGIyImJy4DJy4BNTQ2Ny4BNTQ2Nz4DMzIW
+ FRQGFRQWFz4FNz4DA+MLEiYuHoGbnjwLKj1SY3ZEKzwRExswQyhckXhmMQgSCQQJBwQnGh0S
+ BAECAwMBERQUEQIBAwIBBAoSDh8XCQICLnd+fGZHChUdFRED1Q8UFTEgFTpDSCIPOUNGOSUK
+ DgwlJBouT2g6CQwFfK1wOwo9Njg8Dl6QuGcCCxQOGg1n0md93lUuOyIOSTpy8XtYq1IWMzUz
+ Kh4FCw8KBQAAAAABAM3/jQFWBmoAMQCeuwAIAAYAJAAEK0EhAAYACAAWAAgAJgAIADYACABG
+ AAgAVgAIAGYACAB2AAgAhgAIAJYACACmAAgAtgAIAMYACADWAAgA5gAIAPYACAAQXUEDAAYA
+ CAABcUEFABUACAAlAAgAAnG4AAgQuAAF0LgABS+4ACQQuQATAAf0uAAkELgAHdC4AB0vuAAk
+ ELgALdC4AC0vALgAAC+4ABgvMDETMh4CFRQGFRQeCBUUDgIjIi4CNTQuBDU8AjY0NjwBNTQ+
+ AvwTFwwEAQIDBAUFBQQDAhkiIgkJDAYCAQECAQEBAQEJEgZqFiMtFxEiDgtZibDEzcSxiloM
+ HTMmFhQfJxMNNUdSUk0fF3Ocur2zjl0JEjIuIQABAKX/rAXTBB8AcgGquwBkAAcAXAAEK7sA
+ CgAEABsABCu7ACgABAA3AAQrQQUAGgAbACoAGwACcUEhAAkAGwAZABsAKQAbADkAGwBJABsA
+ WQAbAGkAGwB5ABsAiQAbAJkAGwCpABsAuQAbAMkAGwDZABsA6QAbAPkAGwAQXUEDAAkAGwAB
+ cbgAGxC4ABTQuAAUL7gAKBC4ACXQuAAlL0EFABoANwAqADcAAnFBIQAJADcAGQA3ACkANwA5
+ ADcASQA3AFkANwBpADcAeQA3AIkANwCZADcAqQA3ALkANwDJADcA2QA3AOkANwD5ADcAEF1B
+ AwAJADcAAXFBIQAGAGQAFgBkACYAZAA2AGQARgBkAFYAZABmAGQAdgBkAIYAZACWAGQApgBk
+ ALYAZADGAGQA1gBkAOYAZAD2AGQAEF1BAwAGAGQAAXFBBQAVAGQAJQBkAAJxuABkELgAQ9C4
+ AEMvuABkELkAUwAF9LgAUNC4AFAvugBuADcAKBESObgAChC4AHTcALgAXy+4AC0vuwBpAAMA
+ PAAEK7sAAAADACAABCu6AGQALQBfERI5ugBuAC0AXxESOTAxATIeAhceAxUUDgIjIi4CNTQm
+ NCY0JjU0LgIjIg4CBx4BFRQOAiMiJjU0PgQ1NC4CIyIOBAceARUUDgIjIi4CNTQ2NTQuBCcm
+ NTQ2MzIeAhc+AzMyHgIXPgME/BdAPC4GAwUFAwcPFxAREwkDAQIBFyQrExFMXmImAgISGyAN
+ GhUCBAQEAhcmNBwMMkFKSEAWBAMLExwSDRAIAwEBAwQHCgYNEBAUIRoUByBbXVIYLVFFOBMz
+ dGtWA8kxXIRSInqNjTMzRSoSDxwnGBBSanluVxU5UDMXJ0NcNh8lEoXNjEk4MxFPant3aiU3
+ VDkcIDpPX2o4M1QXKlFAKBMhLhoRJRQZZH2Kf2kdQC4kJyVYkm49dVo3JkVfOjRWPSEAAQDN
+ /8kD+gPjAEoBRbgASy+4AEwvuABLELgARtC4AEYvuQA3AAT0QSEABgA3ABYANwAmADcANgA3
+ AEYANwBWADcAZgA3AHYANwCGADcAlgA3AKYANwC2ADcAxgA3ANYANwDmADcA9gA3ABBdQQMA
+ BgA3AAFxQQUAFQA3ACUANwACcbgABdC4AAUvuAA3ELgACNC4AAgvuABMELgAFNy4ABvQuAAb
+ L7gAFBC5ACoABPRBBQAaACoAKgAqAAJxQSEACQAqABkAKgApACoAOQAqAEkAKgBZACoAaQAq
+ AHkAKgCJACoAmQAqAKkAKgC5ACoAyQAqANkAKgDpACoA+QAqABBdQQMACQAqAAFxuAAj0LgA
+ Iy+4ADcQuAA00LgANC+4AEYQuAA/0LgAPy8AuAAAL7gADy+4AB4vuAA8L7oACAAeAAAREjm4
+ AA8QuQAtAAP0MDEBMh4CFRQGFT4FMzIeAhUcARYUFhQVFAYjIi4CNTwBJjQmNDU0JiMiDgQH
+ BhQVFA4CIyImNTQ+BDU0PgIBIQwVDggCG0hTWVZQICZKOiMBAQ0aEh0VDAEBGh8PSV9tZlYY
+ AgoVIBcbEAEBAgEBCRIeA+MZKzceFEQtGz49OSsaLUhcLy+BjItyTgg8RQogPDEhY3N6b1sb
+ UkQiOEtTVSY+fTtXbDsUOisKTnWQmJZBLVI+JAAAAAIANf/jBHsDxQAXADUBYbgANi+4ADcv
+ uAAF3LgANhC4ABHQuAARL7kAJwAE9EEhAAYAJwAWACcAJgAnADYAJwBGACcAVgAnAGYAJwB2
+ ACcAhgAnAJYAJwCmACcAtgAnAMYAJwDWACcA5gAnAPYAJwAQXUEDAAYAJwABcUEFABUAJwAl
+ ACcAAnG4AAUQuQAxAAX0QQUAGgAxACoAMQACcUEhAAkAMQAZADEAKQAxADkAMQBJADEAWQAx
+ AGkAMQB5ADEAiQAxAJkAMQCpADEAuQAxAMkAMQDZADEA6QAxAPkAMQAQXUEDAAkAMQABcQC4
+ AABFWLgADC8buQAMAAg+WbsAAAADABgABCu4AAwQuQAqAAL0QSEABwAqABcAKgAnACoANwAq
+ AEcAKgBXACoAZwAqAHcAKgCHACoAlwAqAKcAKgC3ACoAxwAqANcAKgDnACoA9wAqABBdQQMA
+ BwAqAAFxQQUAFgAqACYAKgACcTAxATIeAhUUDgQjIi4CNTQ+BBciDgIHDgMHDgMVFBYzMj4E
+ NTQuAgOBPF1AIViQtryzQz5dPR5Lf6m7w2UmSEM9HBQsMDEZO2dMK0I5Opymo4BPFycyA8Ul
+ QFYxbMWpiGA0GjlZQF+6qJBpPH8bKjUaEg4KDhIqaXN3OTlANVt8jplMJzchDwAAAAIAzP2y
+ BY8D+gBDAGQA8LgAZS+4AGYvuABlELgAP9C4AD8vuAAA0LgAAC+4AD8QuQBjAAf0ugAOAD8A
+ YxESObgAZhC4ABrcuABjELgAJtC4ACYvuABjELgAK9C4AD8QuAA10LgANS+4ABoQuQBNAAT0
+ QQUAGgBNACoATQACcUEhAAkATQAZAE0AKQBNADkATQBJAE0AWQBNAGkATQB5AE0AiQBNAJkA
+ TQCpAE0AuQBNAMkATQDZAE0A6QBNAPkATQAQXUEDAAkATQABcQC4AAUvuAAwL7sAFQADAFIA
+ BCu7AEQAAQAjAAQrugAOADAABRESOboAJgAjAEQREjkwMRM0PgIzMh4CFRQGHQE+BTMyHgIV
+ FA4GIyImJx4DFRQOAiMiLgI1ND4CNTQuAjU0PgITMj4GNTQuAiMiDgQHDgMVFA4CKwHTBgwR
+ CxsjEwgEI3OQo6ScQT5aOxw/bZGkraaVOQ4YCwEFBAQKFiIYERUMBQMDAwcIBwIDAoc0ipuj
+ m4lnPBQiLRotbHV5cmcpFxoMAwcXKyQUAzNHUCcJHTRIKidMMRQjSEQ9LRocM0kuOHd4dGhY
+ QCQBA0NlUUIhNmhTMhQkMx4lVlBBDwlZiatcPIF/ef2dIThMWF9eWSYXIhcMEB0mLTEYDhQS
+ FQ4SHBIKAAAAAgAp/a4E4wQIADMASQEuuABKL7gASy+4AAjcuAAA0LgAAC+4AAgQuQAZAAf0
+ QQUAGgAZACoAGQACcUEhAAkAGQAZABkAKQAZADkAGQBJABkAWQAZAGkAGQB5ABkAiQAZAJkA
+ GQCpABkAuQAZAMkAGQDZABkA6QAZAPkAGQAQXUEDAAkAGQABcbgAHNC4ABwvuABKELgAKNC4
+ ACgvugA+AAgAGRESObkARwAH9EEhAAYARwAWAEcAJgBHADYARwBGAEcAVgBHAGYARwB2AEcA
+ hgBHAJYARwCmAEcAtgBHAMYARwDWAEcA5gBHAPYARwAQXUEDAAYARwABcUEFABUARwAlAEcA
+ AnEAuAAAL7gAAEVYuAASLxu5ABIACj5ZuwA0AAEAIwAEK7oAHAASAAAREjm6AD4AEgAAERI5
+ MDEBMhYVFA4BAhUUHgIVFA4CIyIuBDU0NjcOBSMiLgI1ND4GNz4BATI+BDc+ATcOBxUUFgSw
+ GRoPEw8ICQgXISMMCxALBwMBAwkqcYWTlpRDRl85GDhli6S3v8BaCRb8mT+RlJKDbSUGEQk9
+ j5aYi3hZMyoECCxCGnC8/u2+YsKmfRweKxwNBx03YZBmZ/WGKlpXTzsjGC0/KC5teHx6c2NP
+ Giow/CUmQFVdXytVo0cTPU5bYmVhWiYmGgAAAQC//9MEugPbAEABHrsALgAGADwABCu7ABQA
+ BwAcAAQrQSEABgAuABYALgAmAC4ANgAuAEYALgBWAC4AZgAuAHYALgCGAC4AlgAuAKYALgC2
+ AC4AxgAuANYALgDmAC4A9gAuABBdQQMABgAuAAFxQQUAFQAuACUALgACcbgALhC4AAXQuAAF
+ L7gALhC4AAjQuAAIL0EFABoAHAAqABwAAnFBIQAJABwAGQAcACkAHAA5ABwASQAcAFkAHABp
+ ABwAeQAcAIkAHACZABwAqQAcALkAHADJABwA2QAcAOkAHAD5ABwAEF1BAwAJABwAAXG4ABQQ
+ uQAhAAX0uAAUELgAQtwAuAAARVi4ADMvG7kAMwAIPlm7AA8AAwAkAAQruAAPELgAANC4AAAv
+ MDEBMh4CFRQGBz4FMzIeAhUUDgIjIiY1ND4CNTQmIyIOAgcOAxUUDgIjIjU0PgQ1ND4CAQIR
+ HBQLAgIeXnKAg343MUwzGg8cJxgREg4RDjwwLHeJlEksPSgSEx8pFhIEBQYFBAIJEQPVMll7
+ ShIfDixeWlE8JC9RbD0wVUAmHRYNHCxDNURNJElvSy1ZZHRINEcrEjQDWYyusKM7MEInEQAA
+ AAEASP/TBAwD8ABEAQi7ABcABQAvAAQrQQUAGgAvACoALwACcUEhAAkALwAZAC8AKQAvADkA
+ LwBJAC8AWQAvAGkALwB5AC8AiQAvAJkALwCpAC8AuQAvAMkALwDZAC8A6QAvAPkALwAQXUED
+ AAkALwABcbgAFxC4AEbcALgAAC+4AABFWLgAIC8buQAgAAg+WbsAFAACADIABCu4ABQQuQA3
+ AAP0ugAPABQANxESObgAIBC5ACgAA/RBIQAHACgAFwAoACcAKAA3ACgARwAoAFcAKABnACgA
+ dwAoAIcAKACXACgApwAoALcAKADHACgA1wAoAOcAKAD3ACgAEF1BAwAHACgAAXFBBQAWACgA
+ JgAoAAJxMDEBMh4CFRQGBw4FBz4DMzIWFRQOBiMiLgI1NDYzMj4ENTQmIyIOAiMiLgI1ND4G
+ AvQSHRQLFSMydnhzYEUNIoSls1GAeDxlhJCTgmcdGB4QBSAfQKSpon5NRVlpx6mEJg4YEgsu
+ TWdxdmtaA/APFRkJFRgGCSczPkNDHwkgHxZYWjxsYFNENCQTGCEkDRoLIjpOWFwsKSQfJh8J
+ FSQcIUpLSkM5KRgAAAEAAv+kAw4FiwBNANC7ADAABwA/AAQrQSEABgAwABYAMAAmADAANgAw
+ AEYAMABWADAAZgAwAHYAMACGADAAlgAwAKYAMAC2ADAAxgAwANYAMADmADAA9gAwABBdQQMA
+ BgAwAAFxQQUAFQAwACUAMAACcbgAMBC5AEQABvS4AAvQuABEELgAENC4ABAvuAAwELgAGtC4
+ ABovuAAwELgAH9C4AB8vALgAFS+4ADovuwALAAMASQAEK7gACxC4AAPQuAADL7gACxC4AAbQ
+ uAAGL7gACxC4ACDQuAAgLzAxEzQ2MzIWMzI+Ajc+AzU0PgIzMh4CFRQOAh0BPgMzMhYVFAYH
+ DgMHDgUVFAYjIi4CNTQ+AjcOAyMiLgICEBkZRSsIIi0zGgEBAQEIDREJCRkVDwMEA0RNKxYN
+ MTckLgksQVIvAgUFBQQCKiYJDQgDBwoIAhczMS0SND0hCgMQEA8IAwMEAi1lXEsTKl9PNBQi
+ MRwdc4WBKgsGBgQBLRkXDwcCBgkKBjqLj4pyUQ83Lx82SCpUjYaLUQIGBQMeJyUAAAAAAQDN
+ /90DsgP+AEYBhLgARy+4AEgvuABHELgAQtC4AEIvuQAKAAX0QSEABgAKABYACgAmAAoANgAK
+ AEYACgBWAAoAZgAKAHYACgCGAAoAlgAKAKYACgC2AAoAxgAKANYACgDmAAoA9gAKABBdQQMA
+ BgAKAAFxQQUAFQAKACUACgACcbgASBC4AC/cuQAgAAX0QQUAGgAgACoAIAACcUEhAAkAIAAZ
+ ACAAKQAgADkAIABJACAAWQAgAGkAIAB5ACAAiQAgAJkAIACpACAAuQAgAMkAIADZACAA6QAg
+ APkAIAAQXUEDAAkAIAABcbgAG9C4ABsvuAAvELgAKNC4ACgvuABCELgAO9C4ADsvALgAAEVY
+ uAAjLxu5ACMADD5ZuAAARVi4ADYvG7kANgAIPlm5AA8AA/RBIQAHAA8AFwAPACcADwA3AA8A
+ RwAPAFcADwBnAA8AdwAPAIcADwCXAA8ApwAPALcADwDHAA8A1wAPAOcADwD3AA8AEF1BAwAH
+ AA8AAXFBBQAWAA8AJgAPAAJxMDETMhYVFA4EFRQeAjMyPgQ3PgM1NC4CNTQ2MzIeAhUUBhQG
+ FAYVFA4EIyIuAjU8ATY0NjQ1ND4C/B0tAwYFBgMOGycZHU5TVEg4DQcJBQICAgIiFwwSDAcB
+ AgFDaoSBciIzPiAKAQEDChEDnEA/FU9jbWdYHCk1HgsHDhUaIRQKM0hYMDZtYEwVTj8VICcT
+ DFJ0i42EMTJPPSwcDSU6RCAVVWt2blsZJUs6JQABABz/sANXA/4ARwB9uwAsAAcANgAEK0EF
+ ABoANgAqADYAAnFBIQAJADYAGQA2ACkANgA5ADYASQA2AFkANgBpADYAeQA2AIkANgCZADYA
+ qQA2ALkANgDJADYA2QA2AOkANgD5ADYAEF1BAwAJADYAAXEAuAAxL7gAAEVYuAAaLxu5ABoA
+ DD5ZMDETMhYXHgUXHgEzMjY3PgU3PgEzMhYVFAYHDgUHDgMVFA4CIyIuAjU0LgInLgUnLgE1
+ NDZCGB8QBCg5Qz80Dg4TCA4PCgUaIiglIAodOyUNEwwOCh0iIyIfCwseHBMcJicKCgsGAQgO
+ FAwILTtEPzMNDQwUA8MuPxNSZ3NpVBQVESUXDEhkc2xaGUxMHRoSLhoUS2BrZlgdHExOSRka
+ OC8fEB0mFhUoKC0aEVBodm9dHBtAHiY4AAEAHP/JBboD4QB3ACYAuABmL7gAPS+4AABFWLgA
+ UC8buQBQAAg+WboAWgBmAD0REjkwMRMyHgIXHgUXHgMzMjc+BTc+AzMyFhUUBgcGFRQeAhce
+ AzMyNz4FNz4BMzIVFAYHDgcHDgMjIi4CJy4DJw4FBw4DIyIuAicuBScuATU0NlAOFA8NCAUm
+ MzkzJAUFCQkIBQYHBRwmLCwnDxUfICUdFxEcDAMpNzYNCRANCwUJCgYnNz87Mg0dOBQmERMI
+ ISw0NTQqHgYMBgwcICAgDQMEBDJFSRsIISksKB0GCRIbKB8fHAwFCAYlMzo2KgoJCCADuBUh
+ KBQOUW16a04KDB0bEhUPQldkYFUcKj8pFBUSG1AqDA0mY2JTFhEfGg8cEFVwgnpnHkIwMRY7
+ IA1AWWtwbl9IEyY/LhoZKjYdHGp+hjkOQlViXE8XI0AwHS9IViYaXHB6cFwaGCwTLDMAAAAB
+ ADT/tgNhA/cARwAqALgAAC+4AAIvuAAoL7gAAEVYuAAaLxu5ABoACD5ZugAhACgAAhESOTAx
+ ATYzMhYVFAYHDgMHHgMXHgEVFA4CIyInLgMnDgMHBiMiJjU0Njc+AzcuAzU0NjMyFhceAxc+
+ AwMrBwYPGgoLGkdVYDIsVks7EQwKDhYbDBUKCjZMWzAtV1FIHBQQEBEJCQYzT2U3Plw+HxkS
+ FCwOByU2RCZAe2VHA/IFKx0PHg0cUGNzPTZqXk8aEyMQFSIaDhIQT22DRDl1cGowITkmGzYX
+ D0hke0FXgVg0CxESFxcMMkVVLkuNcU0AAAAAAf+U/csDyAPhAEkAEQC4ACIvuwBDAAMANQAE
+ KzAxJS4HJyY1NDYzMh4CFx4DFz4FNz4BMzIVFAYHDgcHDgMjIiYnJjU0NjMyFhceATMyPgQB
+ zw4wPkdHQzUlBQokEwwdHhwLHFxkXR0iRD43Kx0GHzQUJBwZCjRKWl5bTToNGjc3Nxo0dTYY
+ JBcOHgswTSIRHiIpN0hSDUJdbnNvXEIMFxUhKhMhKhc5k5SEKk2ZjnxgPwo5Ix8UQi0RbJ3A
+ ysiqgR8+SikNSEEcFhQTBgcbLRAqSXCdAAAAAQAb/90EVAPfAIMBDAC4ACYvuAAARVi4AHAv
+ G7kAcAAIPlm4AABFWLgAZi8buQBmAAg+WbsAGgADABIABCu7ADsAAQBIAAQruABIELkANgAC
+ 9LgAANC4AAAvuAA2ELgABdC4AAUvuAA2ELgACNC4AAgvugANABIAGhESObgAEhC5AB8AAfS4
+ ADYQuAAz0LgAMy+4AGYQuQBSAAH0QSEABwBSABcAUgAnAFIANwBSAEcAUgBXAFIAZwBSAHcA
+ UgCHAFIAlwBSAKcAUgC3AFIAxwBSANcAUgDnAFIA9wBSABBdQQMABwBSAAFxQQUAFgBSACYA
+ UgACcboATQBmAFIREjm4AFfQuQBrAAL0uABIELgAe9C4AHsvMDETMh4CMzI2Nz4DNw4DIyIu
+ AjU0NjMyHgIzMj4EMzIWFRQOAgcOAwcyNjM+AzMyFhUUDgIHDgMHDgMHPgIyMzIeAjMyPgIz
+ Mh4CFRQOAiMiLgIjIg4CIyImNTQ2Nz4DNyMiLgI1NDZ3ER4mNikTTi4wXVRGGSdyeXEnMT0i
+ DCsdDxoaHRFAhoB2YkgSGRswRk4eDzVFUisFBwVTgmpbLBcQDxMUBQ5Efb+JKk0/LQoQMDg5
+ GRlVaHI3RVo5HwkJCwYBMF+OXiZaXFomMFZHORMmIygjBy9GWDB0JjgmEgoB7gcHBwEDM2RZ
+ ShgJFBELERofDhwbCQsJEhofGhIYHxErMTMYDDRIVy4CBgoGAw0IBwwJBwEEERMSBC1WSDYN
+ BAQCBAYEJi8mDRUYDCI+MBwNEQ0YHBgiFRYqHwYxSl4zDRUaDAwVAAABAIH+YQQKBiYAZgEz
+ uwAoAAcAQgAEK7sADgAHAGIABCtBIQAGAA4AFgAOACYADgA2AA4ARgAOAFYADgBmAA4AdgAO
+ AIYADgCWAA4ApgAOALYADgDGAA4A1gAOAOYADgD2AA4AEF1BAwAGAA4AAXFBBQAVAA4AJQAO
+ AAJxuAAOELkAEwAH9LoAGABCABMREjm6AEkAYgAOERI5uABJL7kAIAAH9EEhAAYAKAAWACgA
+ JgAoADYAKABGACgAVgAoAGYAKAB2ACgAhgAoAJYAKACmACgAtgAoAMYAKADWACgA5gAoAPYA
+ KAAQXUEDAAYAKAABcUEFABUAKAAlACgAAnG4AA4QuABd0LgAXS8AuAAAL7gAAi+7AC0AAQA9
+ AAQruwAbAAEATAAEK7oAGABMABsREjm4AEwQuABS0LgAUi8wMQE2MzIWFRQHDgUVFB4CFRQO
+ Agc+ATMyHgIVFAYHDgMVFB4CMzI2NzYzMhYVFAYHDgMjIi4CNTQ+Ajc2NTQmIyIGBw4BIyIm
+ NTQ2Nz4DNTQuAjU0PgIDXiImKTspJF1hXEgsKTEpK1ByRgoTCitRPSUcICdZSzEXNVY+Trxk
+ GRUMDykzJV5pcDY+dFk1NFFlMiRRUB07FBUNBB8iMjZWd0shLTctQ3mqBh0JEwwPCgkkMjxE
+ SSQgPURTNi9UTUgjAQEVJzgiHEAiKmx1dzUgNykYNEAQDAsRNyYbLSASGzlYPTt/f305KCEh
+ JQQDAwEeFxo6FiI9OTcdKkVIUzg/eGlWAAAAAQDZ/lgBWQZkACQAlLsABgAFAB0ABCtBIQAG
+ AAYAFgAGACYABgA2AAYARgAGAFYABgBmAAYAdgAGAIYABgCWAAYApgAGALYABgDGAAYA1gAG
+ AOYABgD2AAYAEF1BAwAGAAYAAXFBBQAVAAYAJQAGAAJxuAAGELgAA9C4AAMvuAAdELgAFtC4
+ ABYvuAAdELgAINC4ACAvALgAEy+4AAAvMDEBMhYVFAYVFBoBHgIXFhQVFAYjIiYnLgIKAjU0
+ NjU0PgIBDB8YCQQGBwYGAQEmGh0TBAEDAgMCAQQBCRMGZEo6avuJjP7f/u/2wYAUCA4IPTY5
+ PA+HzwEIASABJ4iL6U4iOSgWAAAAAQBD/nQD+QW8AGcBdLsAHgAHAEkABCu7ACMABgBBAAQr
+ QSEABgAeABYAHgAmAB4ANgAeAEYAHgBWAB4AZgAeAHYAHgCGAB4AlgAeAKYAHgC2AB4AxgAe
+ ANYAHgDmAB4A9gAeABBdQQMABgAeAAFxQQUAFQAeACUAHgACcboAUwBJAB4REjm4AFMvQQUA
+ GgBTACoAUwACcUEhAAkAUwAZAFMAKQBTADkAUwBJAFMAWQBTAGkAUwB5AFMAiQBTAJkAUwCp
+ AFMAuQBTAMkAUwDZAFMA6QBTAPkAUwAQXUEDAAkAUwABcbkADgAH9LkACAAH9EEFABoAQQAq
+ AEEAAnFBIQAJAEEAGQBBACkAQQA5AEEASQBBAFkAQQBpAEEAeQBBAIkAQQCZAEEAqQBBALkA
+ QQDJAEEA2QBBAOkAQQD5AEEAEF1BAwAJAEEAAXG6AE4ADgAIERI5uAAOELgAWdC4AFkvuAAj
+ ELgAadwAuwA6AAMAKgAEK7sAAwACAFwABCswMRM+ATMyHgIVFAYHDgEVFB4CFx4BFRQGBw4D
+ FRQXHgEVFA4EIyImJy4DNTQ2MzIXHgEzMj4ENTQuAicuATU0PgI3LgM1NDY3PgE1NCYjIgYH
+ BiMiNTQ+AvhLiz08Y0gnLTAYHR1Bak0xLDQtSXRQK15NVyxMZnaAPy1VKRolFwsTEAgFQXQ0
+ RnRcRC0WGis6IFFGN1lyOzhiSysrMyQgXEo9k00YERUOGiYFgx0cGjBHLS5uPyAyFRIeFxEG
+ BB4UFzENFSotMh4+UkSeW0Z8aVI6Hw4PChwgIg8VHAIXEx4yQUZHHidKQz0aQmstK0U3LBEF
+ FiU2JiNbOipGHTM4KCoOFgseIBwAAQBNAb4EsAPLACwAHwC4ABIvuAAnL7sACgADABoABCu7
+ AAUAAwAfAAQrMDETPgMzMhYXFjMyPgI3PgEzMhUUBgcOASMiJy4BIyIOAgcOASMiJjU0Nm0u
+ X2BeLDFXIyM+IE1ZZzkZJQwQHiF701FaNCY9IBYzP08yFSgQDhAPAjNGdFQuP0dHJEFcORkW
+ FRJBKpuYWkBBHjxaPRoYEhEOKgAAAAABAAr/zwYBBRQAkAEKuwAPAAUALgAEK0EhAAYADwAW
+ AA8AJgAPADYADwBGAA8AVgAPAGYADwB2AA8AhgAPAJYADwCmAA8AtgAPAMYADwDWAA8A5gAP
+ APYADwAQXUEDAAYADwABcUEFABUADwAlAA8AAnG4AC4QuAAx0LgAMS8AuAAARVi4ACkvG7kA
+ KQAIPlm7AFgAAwBiAAQruwBtAAEAdgAEK7gAKRC5ABQAAfRBIQAHABQAFwAUACcAFAA3ABQA
+ RwAUAFcAFABnABQAdwAUAIcAFACXABQApwAUALcAFADHABQA1wAUAOcAFAD3ABQAEF1BAwAH
+ ABQAAXFBBQAWABQAJgAUAAJxuABtELgAatC4AGovMDEBIg4EBw4DBw4BFRQeAjMyPgQ3NjMy
+ FRQGBw4FIyIuAjU0NjcOASMiLgI1NDY3PgM3NjcOASMiLgI1ND4CNz4BNz4DMzIeAhUUDgIj
+ IiYnDgMHPgEzMh4CFRQGKwEiBgcOAQc+AzMyHgIVFA4CIyImNTQmA6cNPFBbVEYTDi45QiIG
+ CAscMCY7pb3Ox7lKFg4MEBJGrr/IxLdNRFYyEgQDKkEOFxsNAxEYFSMpMyUvakFmFRoiEwcf
+ LTQVMI1LgOG2gyMPIx4UHy82FxMzGQ1AWWw5Gi4UMGJPMxwRnDyqWz5vKkuYinMmJTAcCgwP
+ DwMGDwgBmAoRFBMQBAMKDQ8HFysUGy0fESZDW2hxOBAMCB4SR4Z3Y0coIDxUMxMkEwgIDBMX
+ CxsUAwMGCg4JfIgLDQYOFg8XIRUNBAgRCIC4dzgYIiQMDSglGwUKBy1EWTQCAQ0XIBITChUO
+ P4I/ERoSCQkSGRAQFw8HBw8LBgAAAAABAKj+1wJGAVgAJQB+uwADAAYAFQAEK0EFABoAFQAq
+ ABUAAnFBIQAJABUAGQAVACkAFQA5ABUASQAVAFkAFQBpABUAeQAVAIkAFQCZABUAqQAVALkA
+ FQDJABUA2QAVAOkAFQD5ABUAEF1BAwAJABUAAXG4AAMQuAAn3AC4AAovuwAAAAIAGgAEKzAx
+ ATIWFRQOBCMiJjU0Njc+AzU0LgIjIg4CIyI1ND4CAaZOUilCU1JJGBcWGRQsXUswDBETBxEa
+ FhYMIBMiMgFYZmEnX2NdSCwgFRQaECJUXmY2ExkPBQkLCR8PIBsSAAAAAAH/df3FA0YGeQBs
+ AVW4AG0vuABuL7gAbRC4AADQuAAAL7gAENC4AG4QuAAc3LkAKQAG9EEFABoAKQAqACkAAnFB
+ IQAJACkAGQApACkAKQA5ACkASQApAFkAKQBpACkAeQApAIkAKQCZACkAqQApALkAKQDJACkA
+ 2QApAOkAKQD5ACkAEF1BAwAJACkAAXG4AAAQuQA/AAf0QSEABgA/ABYAPwAmAD8ANgA/AEYA
+ PwBWAD8AZgA/AHYAPwCGAD8AlgA/AKYAPwC2AD8AxgA/ANYAPwDmAD8A9gA/ABBdQQMABgA/
+ AAFxQQUAFQA/ACUAPwACcbgAM9C4AAAQuABo0LgAaC8AuwBhAAMATQAEK7sAFwACACwABCu7
+ ADgAAwA/AAQruAA/ELgAANC4AAAvuAA/ELgAA9C4AAMvuAA/ELkAMwAD9LgAC9C4AAsvuAAz
+ ELgAENC4ABAvuAAXELgAIdwwMQEOASMiLgI1NDY3PgM3PgUzMh4CFRQOAiMiJjU0Nz4BNTQm
+ IyIOBAc+AzMyFRQOAgccAQ4FBw4DIyImJy4DNTQ+AjMyHgQzMj4ENTQuAgFEIDkYNUgsEyQf
+ DyE0TDoFIzZESk0lIjstGgoXJBoQGAQICw8THDc0LSQYA0ljQikQOyZUh2EBAQIDBAYECBoo
+ NyVKhUklLxsKBQ4WEgwvPEZEPhcOFQ8JBgICAQICugICCRIcEx8eAgECAgICnfS2fEwiITA4
+ FxhEPywVEwsLF0EeICwYPWie2pEDCAgFPRcjGhAFGWmMpqypk3IfPk8uERsWCxQUEwoJICAX
+ CQ8QDwk3X4CSnk5MjnZZAAAAAAIAbf7LAmABagAjAEAAjLsABQAFABcABCtBIQAGAAUAFgAF
+ ACYABQA2AAUARgAFAFYABQBmAAUAdgAFAIYABQCWAAUApgAFALYABQDGAAUA1gAFAOYABQD2
+ AAUAEF1BAwAGAAUAAXFBBQAVAAUAJQAFAAJxuAAFELkAKQAH9LkAOQAF9LgABRC4AD7QuAA+
+ LwC4ACQvuAAMLzAxEzIeAhUUDgQjIiY1NDY3PgM1NC4CIyImNTQ+AjcyHgIVFA4CIyImNTQ2
+ Nz4DNTQuAjU0Nt0VMiseFiQvMTIUDhIfDiQtGAkKFiMZCwUGDhe+H0xALB0vOx8OFCANEhcO
+ Bi43LgwBDClMbEIfQkA5KxkiDQwbDiI2NDklFTs1JRIIBA8QDF44WnM6Q2lJJg0MDRgQFyQp
+ MiVIYEMzGwgQAAADAQL/2QhcAPwAGwArAEMBNLoAHwAmAAMrugAvADcAAyu6AAMADQADK0EF
+ ANoADQDqAA0AAl1BGwAJAA0AGQANACkADQA5AA0ASQANAFkADQBpAA0AeQANAIkADQCZAA0A
+ qQANALkADQDJAA0ADV1BGwAGAB8AFgAfACYAHwA2AB8ARgAfAFYAHwBmAB8AdgAfAIYAHwCW
+ AB8ApgAfALYAHwDGAB8ADV1BBQDVAB8A5QAfAAJdQQUA2gA3AOoANwACXUEbAAkANwAZADcA
+ KQA3ADkANwBJADcAWQA3AGkANwB5ADcAiQA3AJkANwCpADcAuQA3AMkANwANXbgAAxC4AEXc
+ ALgAAC+4ABwvuAAsL7gAAEVYuAAKLxu5AAoACD5ZuAAARVi4ACQvG7kAJAAIPlm4AABFWLgA
+ NC8buQA0AAg+WTAxJTIWFRQOBCMiJjU0PgI3NjMyFjMyPgIlMhYVFA4CIyI1NDY3PgEFMhYV
+ FA4CIyImNTQ+Ajc+Azc+AQgfFSgbKjMyKgsTEgYMFA8PCAcJCAcUGR75uxUoKzxCF0QnMRo+
+ A0gWJyk6QhkdLwUNFhEPDw4RDxEg+CYuFjAtKB4SJiAQKy0rERALDxIPBCYuIkU4JD4uVCoW
+ FwQmLiBGPCcqIBAlJiMPDQcCBAsMFQAAAAEACAIhAs8FiwBEAJS7ACwABAA2AAQrQSEABgAs
+ ABYALAAmACwANgAsAEYALABWACwAZgAsAHYALACGACwAlgAsAKYALAC2ACwAxgAsANYALADm
+ ACwA9gAsABBdQQMABgAsAAFxQQUAFQAsACUALAACcbgALBC4ABPQuAATL7gALBC4ACXQuAAl
+ L7gANhC4ADvQuAA7LwC4AAsvuAAxLzAxEzQ+Aj8BND4CMzIeAhUUBgc+AzMyHgIVFAYjIg4C
+ Bw4FFRQOAiMiLgI1ND4CNw4BBwYHIi4CCAobLiS4CA0SCgkYFQ4EAihKPSoIERsSCiMUBitB
+ Uy0BAgIDAgILFB4TCw8IAwIEBQM5XiMpIgwOCQMEPQ8VEQ4HFzRXPyMUHyUQFEEiBAkGBAwR
+ EwgPDQUHCwYZVGNnWD8JDyAaERwuPSE6WlRXNwkRCAkICw8RAAEACAExAs8FiwBnAHW7AGMA
+ BgBBAAQruABBELgAWNy4AAPQuABjELgADdC4AA0vuABjELgAEtC4ABIvuABBELgALtC4AC4v
+ uABBELgAMdC4ADEvuABjELgAS9C4AEsvuABjELgATtC4AE4vuABjELgAYNC4AGAvALgAFy+4
+ AEYvMDEBMhYVFA4CBw4DBw4DFRQOAiMiLgI1NDY1DgEjIiY1NDYzMhYzMjY3NDY3DgEHBgci
+ LgI1ND4CPwE0PgIzMh4CFRQGBz4DMzIeAhUUBiMiDgIHFAYHPgMCuA4JCw4OBAsoPlg7AgIB
+ AQsUHhMMDgkDASdiMiwqDA8QIh8RTkoFBTleIykiDA4JAwobLiS4CA0SCgkYFQ4EAihKPSoI
+ ERsSCiMUBitBUy0CAi9bTTYDgQsHBw0LCAIGEhYYDEB7Y0MIDyAaET1hej0XKxUHDiUXERII
+ Cws5gk8JEQgJCAsPEQYPFREOBxc0Vz8jFB8lEBRBIgQJBgQMERMIDw0FBwsGIotXChIOCQAA
+ AAEBFAPzA30F5QApABUAuAADL7gAHy+6ABgAHwADERI5MDEBPgEzMhYXHgMXHgEVFA4CIyIu
+ AicOAwcGIyImNTQ2Nz4DAi0LJRQRHgYPKzAyFhQRCxIXCwszQEMZGD9HTSUWDw4NEBEPO0dK
+ Bb4UEw8RKkg6LQ8OHA0MFA8JJkZgOy9fXVgoFx0VFzITEEJWYwAAAAAEADn+mgkQBXUAXwCC
+ AJkA1QKEuwAPAAQAVgAEK7sAsAAHAJoABCu7AMwABgC6AAQruwCLAAQAYAAEK7sAdwAEAJcA
+ BCtBIQAGAA8AFgAPACYADwA2AA8ARgAPAFYADwBmAA8AdgAPAIYADwCWAA8ApgAPALYADwDG
+ AA8A1gAPAOYADwD2AA8AEF1BAwAGAA8AAXFBBQAVAA8AJQAPAAJxugBJAFYAdxESOUEFABoA
+ YAAqAGAAAnFBIQAJAGAAGQBgACkAYAA5AGAASQBgAFkAYABpAGAAeQBgAIkAYACZAGAAqQBg
+ ALkAYADJAGAA2QBgAOkAYAD5AGAAEF1BAwAJAGAAAXG6AHIAVgB3ERI5QQUAGgCXACoAlwAC
+ cUEhAAkAlwAZAJcAKQCXADkAlwBJAJcAWQCXAGkAlwB5AJcAiQCXAJkAlwCpAJcAuQCXAMkA
+ lwDZAJcA6QCXAPkAlwAQXUEDAAkAlwABcUEhAAYAsAAWALAAJgCwADYAsABGALAAVgCwAGYA
+ sAB2ALAAhgCwAJYAsACmALAAtgCwAMYAsADWALAA5gCwAPYAsAAQXUEDAAYAsAABcUEFABUA
+ sAAlALAAAnFBBQAaALoAKgC6AAJxQSEACQC6ABkAugApALoAOQC6AEkAugBZALoAaQC6AHkA
+ ugCJALoAmQC6AKkAugC5ALoAyQC6ANkAugDpALoA+QC6ABBdQQMACQC6AAFxuAB3ELgA19wA
+ uAAqL7gAPC+4AABFWLgAkC8buQCQAAg+WbgAAEVYuAC1Lxu5ALUACD5ZuwAiAAIACAAEK7sA
+ EQABAFMABCu4ACIQuAAA0LgAAC+6AEkACAAiERI5ugByAFMAERESObgAkBC5AH4AAfS4ANHQ
+ MDEBMh4CFRQGBw4FFRQzMj4ENTQuAjU0PgIzMhYXPgMzMhYVFAYHDgUHDgMjIiY1NDY3PgU3
+ DgEHDgUjIiY1ND4CNz4DATQ+BjMyHgIVFAYPAR4DFRQOBCMiLgIBLgEnDgMVFB4CMzI+BDU0
+ JgE0PgQzMh4CFRQGBw4FFRQeAjMyPgI1NC4CJy4BNTQ2MzIXHgMVFA4CIyIuAgLfDxoSChAS
+ JHSEh21EIyJ7kJV6TQYGBggWKSEXHwg5YU05EREUKyMhboqcn5pBLS0aFRULESY1NIeXnZWE
+ MiZiNRdni6WooUI4OzlabTQqbGlbA1YvTWRqaFY8CQ4kIRYXGhcTLikbJkJbanU7OGVMLQJN
+ DhgHQpaAVBkoNBsfT1NPPyYb+r4wTF1ZShQOJCAWFxofSEhENB8RJj4tKWZZPQwSFQgTIRMR
+ DRESNDAiRXOVTzhmTC0FLw8XGw0QFQICMU1eYVohGy5KXFpQGgQRExIHDCIgFxgVCSksISkl
+ F1o/PJq30ePyfVZzRh4oJzKgamrV0c3CtlMTJAs0d3ZtVDJAOypmaWImH0I3JPtkP3pyaFpI
+ MxwJDhMKFRYODBVHWWc2N2xhUz0iGz1gAecTHQ4pdYuaTh4mFQcVLERcdkkuTP53RYN1Y0co
+ CQ4SChQaDA8wQExSVyssPSYRM2KOXD9eRSwMGikPFSAMDUVkfkWBv30+Gz1gAAAA//8ATv/b
+ BZEHJQImADQAAAAHAN4A0QE5AAEAOQBqAv4DewAxAB0AuAAAL7sAEwABAB0ABCu4ABMQuAAW
+ 0LgAFi8wMQEyFRQOAgcOAwceBTMyNjMyFRQOAiMiLgQnLgE1NDY3PgE3PgMC5RkPGB4PNXN0
+ dDcOPVFcWk8cER4KDiAsKwwhNzhCWHZRIhgjH4X+eRsjGBADex8LGhwcDS5SSUIeDS81Nywc
+ Bw0RJR8UDBonOEgtEykYHyQTUJJLERgQBwAAAAADADn/5wmtBUgAcQCSAMIBrbsAhQAGAGAA
+ BCu7ADMABwBKAAQruABKELgAANC4AAAvuABKELgAA9C4AAMvuAAzELgAJtC4ACYvuAAzELgA
+ K9C4ACsvuAAzELkAVAAE9LgAT9C4AE8vQSEABgCFABYAhQAmAIUANgCFAEYAhQBWAIUAZgCF
+ AHYAhQCGAIUAlgCFAKYAhQC2AIUAxgCFANYAhQDmAIUA9gCFABBdQQMABgCFAAFxQQUAFQCF
+ ACUAhQACcbgAVBC4AI/QuACPLwC4AAYvuAAARVi4AEcvG7kARwAIPlm4AABFWLgAWy8buQBb
+ AAg+WbsAFgABAB8ABCu7AGgAAwByAAQruwCzAAIAfQAEK7oAAAByAGgREjm4AHIQuAAm0LgA
+ Ji+4AEcQuQA2AAL0QSEABwA2ABcANgAnADYANwA2AEcANgBXADYAZwA2AHcANgCHADYAlwA2
+ AKcANgC3ADYAxwA2ANcANgDnADYA9wA2ABBdQQMABwA2AAFxQQUAFgA2ACYANgACcboAVABH
+ AAYREjm4AH0QuAB60LgAei+4ADYQuACI0LgAiC+4AH0QuACT0LgAky8wMQEuATU0NjMyHgIX
+ HgEXNz4FMzIeAhUUBisBIg4EBx4DFRQGFAYUBh0BFBYzMiwCNzYzMhYVFAcGDAIjIiY1ND4C
+ NTQ+AjcOBSMiLgI1NBI3PgMzMh4CFx4DByIOAgcOASMiJiMiBgcOAxUUFjMyPgQ3Jy4BBSIO
+ BAcOBSMiLgI1ND4CMzI+Ajc+ATMyHgIVFA4CIyImNTQmBJ4DAw0RBhYWEwUDBQIdIlxpbmle
+ IzBiUDMcEZwqbXqAd2glAwQDAgECARsgeQETARcBDXMNCQsJD3H+8v7Y/sebTEEHCQgBAQEB
+ LHWKmqKlUDdnTzDByVGXg2slEh8ZEgUIHCMmjBVPV1EZFjYVBQsFEykdUoZeND5RSrW8tZZo
+ EQYTUwScDT5QWlRFExNIWGBWQg8XGw0DAQgRDw9Ob4lLkNNLJTAcCgwPDwMGDwgEeyY3Fykw
+ EhshDgoYDgcGDQsLBwUNFyASEwoKEBQTEAUgQDszEw5MYm9kThHKJBQpSWM6BgwIEwpTglgu
+ QUIQKS0uFg88TFYqSY19aUwrHEFrUIsBWbxLbEUhCQwMAgUICg5IEB8vHhopAx0YRJmalUBU
+ WEJxl6myVZMsMMoLEBQTEAQEEBMUEQoMFBYLCxINBxQdIg4cFwkSGRAQFw8HBw8LBgD//wAK
+ /2IGjgclAiYAOwAAAAcA3gE9ATkAAQBKBBkCOwXFACgAdrsADQAFACQABCtBIQAGAA0AFgAN
+ ACYADQA2AA0ARgANAFYADQBmAA0AdgANAIYADQCWAA0ApgANALYADQDGAA0A1gANAOYADQD2
+ AA0AEF1BAwAGAA0AAXFBBQAVAA0AJQANAAJxALgAAC+7ABIAAgAfAAQrMDEBMh4CFRQGBw4D
+ FRQeAjMyPgIzMhYVFA4CIyIuAjU0PgIBGxIgGQ8ZDhM4MyQWJC8YOVM5IgcYCCNCXjs+Wzwe
+ Kz9JBcULDxIGDAYGCSY2QyUTGhAHDQ8NEQ8SIBkPFC1JNiZURS0AAAABACkD9gG4BhkAIwB+
+ uwADAAUAFQAEK0EFABoAFQAqABUAAnFBIQAJABUAGQAVACkAFQA5ABUASQAVAFkAFQBpABUA
+ eQAVAIkAFQCZABUAqQAVALkAFQDJABUA2QAVAOkAFQD5ABUAEF1BAwAJABUAAXG4AAMQuAAl
+ 3AC4AAovuwAAAAEAGAAEKzAxATIWFRQOBCMiJjU0Njc+AzU0JiMiDgIjIjU0PgIBMz5HKkNR
+ T0QTFxQUGStdTjIiHREaFhYMIBgoNwYZS0c2ZllKNR0VDhQdDBQ2Q08sHyUJCwkfDygkGgAC
+ ACkDiwLbBc8AJABJARG7AC8ABQBFAAQruwANAAUAIAAEK0EFABoAIAAqACAAAnFBIQAJACAA
+ GQAgACkAIAA5ACAASQAgAFkAIABpACAAeQAgAIkAIACZACAAqQAgALkAIADJACAA2QAgAOkA
+ IAD5ACAAEF1BAwAJACAAAXG4ACAQuAAY3LgARRC4ACjcQSEABgAvABYALwAmAC8ANgAvAEYA
+ LwBWAC8AZgAvAHYALwCGAC8AlgAvAKYALwC2AC8AxgAvANYALwDmAC8A9gAvABBdQQMABgAv
+ AAFxQQUAFQAvACUALwACcbgADRC4ADnQuAA5LwC4AAAvuAAlL7sANAACAD4ABCu7ABIAAgAb
+ AAQruAASELgAFdC4ABUvMDEBMh4CFRQGBw4DFRQeAjMyNjMyFhUUBiMiLgI1ND4CJTIWFRQO
+ BBUUHgIXFjIeARUUDgIjIi4ENTQ+AgI1EiAZDxkOEzczJBEcIhEzUg4REEo5Plw8His/Sf73
+ ExQZJiwmGTJHSxkUJx8TFB8oFBhCRkU2IjdLTQXFCw8SBgwGBgkmNkMlExoQBw0SDyMaFC1J
+ NiZURS0KGRQTGRsjNlA7LTMbCQECBg0ODBkTDAQOHjNON1yEVCgAAgAXA74C+AZCACQARgDa
+ uwADAAUAFQAEK7oAKgBEAAMrQSEABgADABYAAwAmAAMANgADAEYAAwBWAAMAZgADAHYAAwCG
+ AAMAlgADAKYAAwC2AAMAxgADANYAAwDmAAMA9gADABBdQQMABgADAAFxQQUAFQADACUAAwAC
+ cbgAKhC5ADwABvRBBQDaAEQA6gBEAAJdQRsACQBEABkARAApAEQAOQBEAEkARABZAEQAaQBE
+ AHkARACJAEQAmQBEAKkARAC5AEQAyQBEAA1duAAqELgASNwAuAAlL7gAMS+7AAAAAQAYAAQr
+ MDEBMhYVFA4EIyImNTQ2Nz4DNTQmIyIOAiMiJjU0PgIlMh4CFRQOBCMiJjU0Njc+AzU0Jicu
+ AzU0NgEhPkcqQ1JPQxMXFBQZK11OMiMdERkXFQwPEhgpNwFXHzktGzBNYmJZHxcUEhw/eF46
+ KiMHGxoUNgYZS0c2ZllKNR0VDhUcDBQ2Q08sHyUJCwkPEA8oJBopITZFI0d6ZU41HBUOFiMF
+ C0BVYSw3Ow0CCAsPCx0rAAAAAAEAUABmA3cDtgAeAAsAuAARL7gAAC8wMQEyHgIzMh4CFRQO
+ BCMiLgI1ND4GArQZEQoQGBgmGw5EboyPhTEdOi8eKERaZGlgVAO2ExcTIDZGJWCjhGVDIyA6
+ UzM4cm1lWUo0HQABAGoBVASPAisAHwAXALsADAADABkABCu4ABkQuQAFAAH0MDETMh4CMzI+
+ BDMyFhUUBgcOBSMiNTQ+An0FCRMlIieHpbiwnDcRCx0uEWeSsratRnUCBAgB4wYIBg4UGBQO
+ EAsTKw8GFRgaFQ1CCBoZEgAAAAEAagFUBkQCUAAoABEAuAATL7sABQABACIABCswMRMyHgIz
+ Mj4CNz4HMzIWFRQGBw4HIyI1ND4CfQUJEyUiDUNPShUgeZuytKuMYhERDB4uDGebxNXYw6M0
+ dQIECAHjBggGBggJAwQOEBIRDwwHEAsSLBAEERYaGhcSC0IIGhkSAAAAAAEAdAPqA+0FigAo
+ AB8AuAAPL7gAJC+7AAoAAQAXAAQruwAFAAEAHAAEKzAxEz4DMzIWFxYzMjY3NjMyFRQGBw4B
+ IyInLgEjIg4CBw4BIyI1NDaNJExLSiMnRRwcMTOOWycUDBkaYaZASCkeMBoSKDE+KBEhCxgL
+ BEg3XEIlMzg5bFomEA40IXt5RzM0GDBJMBQSHAwhAAAAAgAOAqQFkQXHAGcAnQFvuwB5AAYA
+ hgAEK7sABgAGAA4ABCu7AEoABQBXAAQruAAGELgAANC4AAAvuAAOELgAENC4ABAvuABKELgA
+ PtC4AD4vuABKELgARdC4AEUvQQUAGgBXACoAVwACcUEhAAkAVwAZAFcAKQBXADkAVwBJAFcA
+ WQBXAGkAVwB5AFcAiQBXAJkAVwCpAFcAuQBXAMkAVwDZAFcA6QBXAPkAVwAQXUEDAAkAVwAB
+ cbgAVxC4AFrQuABaL0EhAAYAeQAWAHkAJgB5ADYAeQBGAHkAVgB5AGYAeQB2AHkAhgB5AJYA
+ eQCmAHkAtgB5AMYAeQDWAHkA5gB5APYAeQAQXUEDAAYAeQABcUEFABUAeQAlAHkAAnG4AHkQ
+ uAB00LgAdC+4AIYQuACJ0LgAiS+4AEoQuACf3AC4ADYvuABPL7sAJgABAGMABCu6AAAATwA2
+ ERI5ugBaAE8ANhESOboAiQBPADYREjm4ACYQuACM0LgAjC8wMQEOAx0BFAYjIi4CNTY3PgE/
+ AS4BNTQ+AjMyHgIXHgMzMj4CNz4DNz4BNz4BMzIeAhUUBgceBRUUDgIVFA4CIyImNTQ+AjU0
+ JicOAQ8BDgMjIi4CJz4BMzIVFA4EBw4DFRQeAhUUBiMiLgI1NDY3DgEjIi4CNTQ2MzI2Nz4B
+ MzIWFQNmAQEBARcUCBcVDwQFBAoFEQ0KCQ8UDAwRCwcCDCs1ORkPJSQgCwkeIyMOBg0CBQ8S
+ BA0NCQwMAQICAgIBAgICFBoaBhEQBQcFAgINHgsGEScnIw0gQD037wsbER0kOUhIQRUCAwIB
+ DA4MDxcPJSAVBQUuWSUbLSITFxgwiFUIHBEYEQSeFj08MQvPHRQPGyUXNjYuai2mFyILDhsW
+ DQ0TGAwcRj0qERgcCwkhJycPFiIGDRITGhsIDSoRETlDRj8yDBRITEENEBoSCRkWFUNVZTgx
+ YCMTJQ4IEyQbEBYkLOEFCBgLHB4eGRMDHD46Lww0W0gyChQbJ051TiplMwsLDxQWCBQREQ42
+ QzotAAAA//8ASP/TBAwF7AImAFQAAAAGAN4KAAAAAAEATACCAykDdwAvAA8AuAAhL7gAAC+4
+ AAMvMDE3DgEjIi4CNTQ+Ajc+ATcuBScuAzU0PgIzMh4CFx4BFRQHDgPbCCYWDhsVDRYmLxpg
+ 24MOP1JeWU4YDSAbEhQfKBUnUHOjeiIXOUaXjn2JAgUDCQ8LExcOCwkglWMNKzI0LyQJBA0O
+ EQkPFQ0HHD1gQxMoGT0wOmhRNQAAAwA1/+MHugPFAEsAaQB6Ani7AFsABAA4AAQruwARAAcA
+ LgAEK7sABQAFAHEABCtBIQAGABEAFgARACYAEQA2ABEARgARAFYAEQBmABEAdgARAIYAEQCW
+ ABEApgARALYAEQDGABEA1gARAOYAEQD2ABEAEF1BAwAGABEAAXFBBQAVABEAJQARAAJxuAAR
+ ELkARAAF9LoADwARAEQREjm4AEfQuABHL0EhAAYAWwAWAFsAJgBbADYAWwBGAFsAVgBbAGYA
+ WwB2AFsAhgBbAJYAWwCmAFsAtgBbAMYAWwDWAFsA5gBbAPYAWwAQXUEDAAYAWwABcUEFABUA
+ WwAlAFsAAnG4ABEQuABl0LgAZS+6AGoAEQBEERI5QQUAGgBxACoAcQACcUEhAAkAcQAZAHEA
+ KQBxADkAcQBJAHEAWQBxAGkAcQB5AHEAiQBxAJkAcQCpAHEAuQBxAMkAcQDZAHEA6QBxAPkA
+ cQAQXUEDAAkAcQABcbgABRC4AHzcALgAAEVYuAApLxu5ACkACD5ZuAAARVi4ADMvG7kAMwAI
+ Plm7AD8AAgB0AAQruAA/ELgAANC4AAAvuAApELkAFgAD9EEhAAcAFgAXABYAJwAWADcAFgBH
+ ABYAVwAWAGcAFgB3ABYAhwAWAJcAFgCnABYAtwAWAMcAFgDXABYA5wAWAPcAFgAQXUEDAAcA
+ FgABcUEFABYAFgAmABYAAnG4AD8QuQBMAAP0uAAzELkAXgAC9EEhAAcAXgAXAF4AJwBeADcA
+ XgBHAF4AVwBeAGcAXgB3AF4AhwBeAJcAXgCnAF4AtwBeAMcAXgDXAF4A5wBeAPcAXgAQXUED
+ AAcAXgABcUEFABYAXgAmAF4AAnEwMQEyHgIVFA4EIyImJwYVFB4CMzI+Ajc2MzIVFAYHDgUj
+ Ii4CNQ4DIyIuAjU0PgQzMh4CFRQGFT4DBSIOAgcOAwcOAxUUFjMyPgQ1NC4CEz4FNTQmIyIO
+ BAbRNEouFliOsLGeNR0nBh8XNFU+Wbatn0IZDAoPDx5WaHmCikU+gWhCSKSjmDs+XT0eS3+p
+ u8NbPF1AIQJEnqCY/PgmSEM9HBQsMDEZO2dMK0I5Opymo4BPFycyrVqzo4xnOikjLG96fnVl
+ A74VJTIdMWpkWUMnJBdGQSM/LxswUGo7Fg0LJRMmV1ZPPSQeQ25QQmpLKBo5WUBfuqiQaTwl
+ QFYxCxULPWRIJ3gbKjUaEg4KDhIqaXN3OTlANVt8jplMJzchD/6oEzY9QTw1ExEeGjBEVGIA
+ //8AG//dBFQF7AImAFsAAAAGAN4lAAAA//8AHf7wBUwGnAImADoAAAAHAIMAkwEJAAIBE/5K
+ AisD1wAgADYApLsAAwAHABQABCtBIQAGAAMAFgADACYAAwA2AAMARgADAFYAAwBmAAMAdgAD
+ AIYAAwCWAAMApgADALYAAwDGAAMA1gADAOYAAwD2AAMAEF1BAwAGAAMAAXFBBQAVAAMAJQAD
+ AAJxuAADELgAANC4AAAvuAADELkAGwAH9LgAFBC4ACTcuAAUELgALNC4ACwvALgAIS+4AA8v
+ uwApAAEAHgAEKzAxARYUFRQOBAcOAyMiLgI1ND4ENz4BMzIWEzIWFRQOAiMiJjU0Njc+Azc+
+ AQHRAQMGCQwPCQgWGRoMChAMBgcMDQwJAgUWECU1HxUoKTpCGR0vFyIPDw4RDxEfAdUMIhQ0
+ kJ+fhmAPDh0YDxAlPS0xf4iJd1sXVWQ8AccmLiBGPCcqICFOHg0HAgQLDBUAAgA1/3kEQgVg
+ AE0AYgFpuwBeAAcAQwAEK7sAMgAEADoABCtBIQAGADIAFgAyACYAMgA2ADIARgAyAFYAMgBm
+ ADIAdgAyAIYAMgCWADIApgAyALYAMgDGADIA1gAyAOYAMgD2ADIAEF1BAwAGADIAAXFBBQAV
+ ADIAJQAyAAJxuAAyELkASAAF9LkAGAAG9LgABdC4AAUvuAAYELgACNC4AAgvuAAyELgAHtC4
+ AB4vuAAyELgAL9C4AC8vuAA6ELgAPdC4AD0vuAA6ELgAUdC4AFEvuABIELgAVNC4AFQvuABI
+ ELgAWdC4AFkvQSEABgBeABYAXgAmAF4ANgBeAEYAXgBWAF4AZgBeAHYAXgCGAF4AlgBeAKYA
+ XgC2AF4AxgBeANYAXgDmAF4A9gBeABBdQQMABgBeAAFxQQUAFQBeACUAXgACcQC4AAAvuAA1
+ L7oACAA1AAAREjm6AB4ANQAAERI5ugA9ADUAABESOboAWQA1AAAREjkwMQEyHgIVFAYHPgMz
+ MhYVFA4EDwEVFA4CBz4DNzYzMhUUBgcOAwcOARUUBiMiLgI1NDY3DgEjIiY1ND4CNzU0PgID
+ MjY3PgE3PgM3DgMVFB4CAhAJGRUPBAItX1lOHRgfKUFSUkoZGAMFBgNCgnltLRYNCxQVKWd6
+ ikwDAyknCQ0IBAEBMGIzZmNGdptVCA0R7CpXLQEHAgMDAwIBNWdSMwoXIwVgFCIxHB9pPB01
+ KBgYFxkyMi0mHQgQJxhtkadRHlBaXy0WEA4uGjNrZVoiWH0TNy8eNUgqFy8YDg9eZVKtqJ1D
+ iypfTzT7lg4OKkwgIldgZzMzen15Mg8dFw0AAAABAAr/YgWGBYEAdgI4uAB3L7gAeC+4AHcQ
+ uAAn0LgAJy+4ABnQuAAZL7gAJxC4ACTQuAAkL7gAeBC4ADHcuQA+AAb0QQUAGgA+ACoAPgAC
+ cUEhAAkAPgAZAD4AKQA+ADkAPgBJAD4AWQA+AGkAPgB5AD4AiQA+AJkAPgCpAD4AuQA+AMkA
+ PgDZAD4A6QA+APkAPgAQXUEDAAkAPgABcbgAJxC5AEYAB/RBBQDmAEYA9gBGAAJdQQMABgBG
+ AAFxQR0ABgBGABYARgAmAEYANgBGAEYARgBWAEYAZgBGAHYARgCGAEYAlgBGAKYARgC2AEYA
+ xgBGANYARgAOXUEFABUARgAlAEYAAnG4AEnQuABJL7oAXwAnAEYREjkAuAAML7gAAEVYuAAs
+ Lxu5ACwADj5ZuAAARVi4AAAvG7kAAAAIPlm7AF8AAwAFAAQruwBMAAEAWQAEK7gATBC4ACTQ
+ uAAkL7gALBC5AEEAAvRBBQAZAEEAKQBBAAJxQSEACABBABgAQQAoAEEAOABBAEgAQQBYAEEA
+ aABBAHgAQQCIAEEAmABBAKgAQQC4AEEAyABBANgAQQDoAEEA+ABBABBdQQMACABBAAFxuABM
+ ELgASdC4AEkvuABZELgAXNC4AFwvuAAAELkAZgAD9EEhAAcAZgAXAGYAJwBmADcAZgBHAGYA
+ VwBmAGcAZgB3AGYAhwBmAJcAZgCnAGYAtwBmAMcAZgDXAGYA5wBmAPcAZgAQXUEDAAcAZgAB
+ cUEFABYAZgAmAGYAAnEwMQUiLgIjIg4EIyImNTQ+Ajc+AzcuAzU0NjMyFhc2NDU0Ej4BMzIe
+ AhUUDgIjIiY1ND4CNTQmIyIOAhUcAQcWMjMyPgIzMhYVFA4CIyImJw4BBx4FMzI+Ajc2MzIV
+ FAYHDgMD51milo5DITo1MTEzHBogNEdLFxY0MCcLPWdKKh8aEHdhAj9jeDoiOy0aChckGhEY
+ BwkIDxMsVEEoAho3HZDGfkALFw5gn81uIkMgDi8dJFVdZGlsNy1VU1MqGw8SFxk6X1dSMTI8
+ Mig8RTwoISsiRkM8GRguR2tWCBYYGAodJxgLDyISpQEIuWMhMDgXF0M/LRQUCiAmKRQfLEmS
+ 2pEdNRkCHiMeGCIRNjQmAgJeeyUCGSQnIhYGEh4YDxEMJRUxNxwHAAACAH7/mwQuBGcAVQCJ
+ ARm4AIovuACLL7gAINy4ABnQuAAZL7gAIBC5AFYABPRBBQAaAFYAKgBWAAJxQSEACQBWABkA
+ VgApAFYAOQBWAEkAVgBZAFYAaQBWAHkAVgCJAFYAmQBWAKkAVgC5AFYAyQBWANkAVgDpAFYA
+ +QBWABBdQQMACQBWAAFxuAAq0LgAKi+4AIoQuABO0LgATi+4AEjQuABIL7gAThC5AHMAB/RB
+ IQAGAHMAFgBzACYAcwA2AHMARgBzAFYAcwBmAHMAdgBzAIYAcwCWAHMApgBzALYAcwDGAHMA
+ 1gBzAOYAcwD2AHMAEF1BAwAGAHMAAXFBBQAVAHMAJQBzAAJxugB2AE4AGRESOQC4ABYvuABC
+ L7oAdgBCABYREjkwMRMmNTQ2MzIWFx4BFz4DMzIWMz4BMzIWFRQGDwEeARUUDgIHHgMVFA4C
+ IyImJy4DJw4DKwEOAQcGIyImNTQ2Nz4BNy4BNTQ+AjcuAQU0JicOASMiJicOAQcOAwcVFAYj
+ IiYnDgMVFBYXPgEzMhYXPgE3NDYzMhYXPgPTFxkSFCwOCkIxMWptazMJEQlAQQkPGgkMMiIk
+ J0RbNCQ0IxAOFhsMCREFBhwnMxwwYFxSIgQuTBsTERARCQgEHxkfHx83TS4xSwLaFBIIIhQa
+ JQUqTCEMGhscDiofCA0GIzsqGA0MCBoRFyMENoVFIxoIEQYqSTYfA7oeFhESFxcRVzwkOyoX
+ AkpAKxwOIA01HE8uQnlvYyosRDUqExUiGg4JCQopOUcoHCweED5tLyE6Jxo1FwouIBdPPDdu
+ aWIsR2e2ICwODQwTEA49HQsLBwYEBBwoAQMhSk1NJBciDQ0QHRYJOisjLQUFIk5SVAAAAAAB
+ AB3+8AVMBWYAiADGuwAGAAcADQAEK0EhAAYABgAWAAYAJgAGADYABgBGAAYAVgAGAGYABgB2
+ AAYAhgAGAJYABgCmAAYAtgAGAMYABgDWAAYA5gAGAPYABgAQXUEDAAYABgABcUEFABUABgAl
+ AAYAAnG4AAYQuAAD0LgAAy+4AAYQuQALAAT0uAAS0LgAEi+4AAsQuAAf0LgAHy+4AAsQuAAi
+ 0LgACxC4ADbQuAA2L7gABhC4AGjQuABoL7gABhC4AHnQuAB5LwC4AAsvuABZLzAxJQ4BBwYU
+ FRQOAiMiNTQ3PgE3DgEjIiY1ND4ENzY0NQ4FIyIuAjU0Njc+Azc1LgU1NDYzMhYXHgMXHgEz
+ MjY3PgM3PgMzMhYVFA4EBw4DBxU+ATMyHgIVFA4CBw4BDwE+AT8BPgEzMhYVFA4CA8sqgkoC
+ GSQnDyQOBgcDbKUoNzwKHztgi2ECIlNXVkk3DBcaDQMXJg9WeI9IPYWBdVk0FhcdJRQtWGFv
+ RBcpEylAFz1rWUkdIjcsIw4MFyc9S0lAEhNDUFYnaaE+JTAcChkiIwtptT4GVZYylQcMBgoR
+ K0VX8A0fEEd2IDZWPB9AJkAdjVoWFB4kEBcSDxASDTxzNAcTEhIOCAwUFwsWGwwFFBseDysO
+ R2Fzc2sqGBMmHD9qXFAkDAojECpcWU4bIDkrGRAfCjZHUk5BExRDSEASHREQBwwSCg4PCAQC
+ ESwP7g0dDisCAgwPEioqJQAAAAIA1v5YAVkGeQAgADwAvLsAKwAFADgABCtBIQAGACsAFgAr
+ ACYAKwA2ACsARgArAFYAKwBmACsAdgArAIYAKwCWACsApgArALYAKwDGACsA1gArAOYAKwD2
+ ACsAEF1BAwAGACsAAXFBBQAVACsAJQArAAJxuAArELgABdC4AAUvuAA4ELkADwAH9LgADNC4
+ AAwvuAA4ELgAHNC4ABwvuAAPELgAJtC4ACYvuAArELgAMNC4ADAvALgAIS+4ABIvuwAzAAMA
+ AAAEKzAxATIeAhUUHgQXFhQVFAYjIiYnLgQ0NTQ+AhMyHgIVFA4CFRQeAhUUBiMiLgI1ND4C
+ AQwSFQsEAgQFBQQCASYaHRMEAQICAgEBCRMYDRkTCwgLCAIDAhAZFRoPBQcOFwIlGS09IyBt
+ got+ZBoIDgg9Njk8FGKClo57JyI5KRYEVBUgKBIJRWiDSCdmXkoKLDswTmIyl++mWAAAAgBC
+ /4kDfwUjAFMAbQDSuwAbAAUAMQAEK0EFABoAMQAqADEAAnFBIQAJADEAGQAxACkAMQA5ADEA
+ SQAxAFkAMQBpADEAeQAxAIkAMQCZADEAqQAxALkAMQDJADEA2QAxAOkAMQD5ADEAEF1BAwAJ
+ ADEAAXG4ADEQuAAF0LgABS+4ABsQuAAV0LgAMRC4AGjQuAAbELgAb9wAuAAiL7gAAC+7ABIA
+ AgBtAAQruwBjAAIAOQAEK7oADQBtABIREjm6AEcAIgAAERI5ugBeADkAYxESObgAYxC4AGXQ
+ uABlLzAxATIeAhUUBgcOAwc+AzMyFhUUBgceARUUDgQjIi4CNTQ2Nz4FNTQmJwYjIiYnIyIO
+ AiMiJjU0PgI3DgEjIiY1ND4EAxYVFAYHDgMHPgMzMhc+ATU0LgIjAt0SHRQLFCNLmoRjFCJc
+ ZWUrgHgtHyYmSnWOiXIeGR4QBSAfRIN2ZEkpGR0cFxIVAgxImo14JRwXNFNoNShHHBwnQGeB
+ gXRIAhUjRYFpSw8ie4uFLComKh4QJTwtBSMPFRkJFBkGDjtOXC4JEAwGWFoqVyMVSTFQlIJq
+ TCoXHh0GHBUHDzdHVVpcLBkhCBERDBsgGyUlJE5LRBsGCCc3LGBaUT0k/jsEBhQaBQs1REsh
+ CRwZEgYiPh0eJxgJAAAAAgECBLQDPQWTAA0AGwD1uAAcL7gAHS+4ABwQuAAJ0LgACS+5AAMA
+ B/RBIQAGAAMAFgADACYAAwA2AAMARgADAFYAAwBmAAMAdgADAIYAAwCWAAMApgADALYAAwDG
+ AAMA1gADAOYAAwD2AAMAEF1BAwAGAAMAAXFBBQAVAAMAJQADAAJxuAAdELgAEdy5ABcAB/RB
+ BQAaABcAKgAXAAJxQSEACQAXABkAFwApABcAOQAXAEkAFwBZABcAaQAXAHkAFwCJABcAmQAX
+ AKkAFwC5ABcAyQAXANkAFwDpABcA+QAXABBdQQMACQAXAAFxALsAAAADAAYABCu7AA4AAwAU
+ AAQrMDEBMhYVFAYjIiY1ND4CJTIWFRQGIyImNTQ+AgFYHx8vJR8hDRYgAbsfHi4mHiENFiAF
+ TikdJi4mIBAeGA5FKB0mLiUgEB4YDgADAC3/nAXNBUIAIgBIAHwBWLsAOAAFABkABCu7AF0A
+ BwB2AAQruwANAAUARAAEK0EhAAYAOAAWADgAJgA4ADYAOABGADgAVgA4AGYAOAB2ADgAhgA4
+ AJYAOACmADgAtgA4AMYAOADWADgA5gA4APYAOAAQXUEDAAYAOAABcUEFABUAOAAlADgAAnFB
+ BQAaAEQAKgBEAAJxQSEACQBEABkARAApAEQAOQBEAEkARABZAEQAaQBEAHkARACJAEQAmQBE
+ AKkARAC5AEQAyQBEANkARADpAEQA+QBEABBdQQMACQBEAAFxQSEABgBdABYAXQAmAF0ANgBd
+ AEYAXQBWAF0AZgBdAHYAXQCGAF0AlgBdAKYAXQC2AF0AxgBdANYAXQDmAF0A9gBdABBdQQMA
+ BgBdAAFxQQUAFQBdACUAXQACcbgADRC4AH7cALsAOwACABQABCu7AAAAAwAjAAQruwBgAAEA
+ cwAEKzAxATIWFRQGFRQXHgMVFA4DBCMiLgI1ND4CNz4DByIOAgcOAyMiJiMOAQcOAxUUFjMy
+ PgY1NC4CBz4BMzIWFRQOBAcOBRUUFjMyPgI3NjMyFRQGBw4FIyImNTQ+BASYJTULDR5LQy1f
+ o9r3/vl+QHZbNzJsq3ppzrWRBRlbY14cDBweHQwGDAYWMSBhmWo4am9Jpq2rnYdjOSBBYvwR
+ Ig4dICE0QUI8FCBMTEc2ISQmTqijkzgRCwkQESBTY3B7hERSVDxlg42OBUIRHQ0WCAoEDDFO
+ bEZt7eTOm1sgSntcT7TE0WxehVYokhIjNSMPGxUNBAEeHl67s6dKb3wtUXKIm6WqVDZfRyjA
+ BQUSFBMoJyUfFwcUQVBZWVYkGCc+YHc5EQ0LJRYoV1VMOyJgUEaRjIFrTgAAAAADADkBIQM1
+ BPoAJgBHAFkAlrsAWAAGACAABCu4ACAQuABD0LgAQy9BIQAGAFgAFgBYACYAWAA2AFgARgBY
+ AFYAWABmAFgAdgBYAIYAWACWAFgApgBYALYAWADGAFgA1gBYAOYAWAD2AFgAEF1BAwAGAFgA
+ AXFBBQAVAFgAJQBYAAJxALgAAC+7ADYAAwBBAAQruwBIAAIAHQAEK7gAQRC5ACwAAfQwMQEy
+ Fh0BMzIVFAYHFRQeAhUUBiMiLgInDgMjIiY1ND4EATIeAjMyPgI3PgMzMhYVFAYHDgMjIjU0
+ PgITMj4CNz4BNwcOBRUUAq4fHwQ7KCASFxIXFw4jIRsGNHt/fTYzMEJqiIuE/dgFCRMlIg1D
+ T0oVQGRSRiMRCx4uGWeTt2l0AgQHXRxxhYg1Ag0QEzJvbWJLLAT6FyIHMSVVMDMgZ2hUDBwo
+ Q2R3MzZjSyxCLTJ7fXVbN/y2BggGBggJAwkQDAgPCxQqEAgeHhZBCRoZEgEGLVBvQy9SHQQQ
+ QFFcWU4aCwAAAAACADkATgSJA48AMQBkACsAuAAAL7gAGy+7AEYAAQBQAAQrugA/ABsAABES
+ ObgARhC4AEnQuABJLzAxARYVFA4CBw4BBx4FFx4DFRQOAiMiLgQnLgE1NDY3PgM3PgMFMhYV
+ FA4CBw4DBx4FMzI2MzIVFA4CIyIuAicuATU0Njc+Azc+AwK+GQ8YHg9r1m0ONENMS0QZDBwZ
+ ERcgIgwhODg+T2ZEHxsjH0J1cHA+GyMYEAG7Cw0PGB4PNWVlZjYON0dRUUkcER0LDxkmLxUy
+ VWOBXiIXIh9CdW9vPBsjGBEDjwIcCxocHQ1dlD4PMTk9Ny0NBgkJDAkMEw4IDh8wQ1c2GSIZ
+ HyQTKElISigSGA8GEA8QCxkcHQ0uRjw3Hw4qMDEnGQYNESUeFCE7VDMSKRkfJBMoQT0+JhEZ
+ DwcAAQCwAOkEZANzADcAlrsAJwAFAAAABCtBBQAaAAAAKgAAAAJxQSEACQAAABkAAAApAAAA
+ OQAAAEkAAABZAAAAaQAAAHkAAACJAAAAmQAAAKkAAAC5AAAAyQAAANkAAADpAAAA+QAAABBd
+ QQMACQAAAAFxuAAAELgAM9C4ADMvuAAnELgAOdwAuAAuL7sAIgABAAIABCu4AAIQuAAY0LgA
+ GC8wMQEmIyIOAgcOBSMiLgI1ND4CMzI+Ajc+AzMyHgIVHAEOAyMiLgI1ND4CA/4MHR5TVUwX
+ E0hYYFZCDxcbDQMBCBEPD05viUtIaVNGJiYwGwoDBQkOCgsYFA4CAwMC8gQJDA0FBBATFBEK
+ DBQWCwsSDgcTHSEPDhAHAgkSGRAzfoJ6XzoGEyIbITxbjAAAAAEAagFUA14CFwAgABcAuwAP
+ AAMAGgAEK7gAGhC5AAUAAfQwMRMyHgIzMj4CNz4DMzIWFRQGBw4DIyI1ND4CfQUJEyUiDUNP
+ ShVAZFJGIxELHi4YaJO3aXUCBAgB4wYIBgYICQMJEA0IEAsTKxAIHh4WQggaGRIAAAQALf+c
+ Bc0FQgAxAGsAkwCqAeC7AHoABQAoAAQruwA3AAUAoQAEK7sADQAFAE8ABCu7AIgABgB0AAQr
+ ugASACgADRESObgAiBC4AETQuABEL0EHAAkATwAZAE8AKQBPAANdQQUAGgBPACoATwACcUEX
+ AFkATwBpAE8AeQBPAIkATwCZAE8AqQBPALkATwDJAE8A2QBPAOkATwD5AE8AC11BAwAJAE8A
+ AXFBBQA5AE8ASQBPAAJdugBnAHQAiBESObgAdBC4AGzQuABsL0EhAAYAegAWAHoAJgB6ADYA
+ egBGAHoAVgB6AGYAegB2AHoAhgB6AJYAegCmAHoAtgB6AMYAegDWAHoA5gB6APYAegAQXUED
+ AAYAegABcUEFABUAegAlAHoAAnG6AIIAKAANERI5uACIELgAl9C4AJcvQQUAGgChACoAoQAC
+ cUEhAAkAoQAZAKEAKQChADkAoQBJAKEAWQChAGkAoQB5AKEAiQChAJkAoQCpAKEAuQChAMkA
+ oQDZAKEA6QChAPkAoQAQXUEDAAkAoQABcbgADRC4AKzcALsAfQACACMABCu7AAAAAwBUAAQr
+ uwBHAAIAhQAEK7sAMgABAKYABCu6AGcApgAyERI5ugB1AKYAMhESOboAggCFAEcREjm6AIgA
+ hQBHERI5MDEBMhYVFAYVFBceAxUUDgIHPgMzMhUUDgIHDgMjIi4CNTQ+Ajc+AwEyHgIVFA4C
+ Bw4DBxYUFR4BMzI2Nz4DNTQuAiMiDgIHDgMjIiYjIgYHHgEXPgMBLgE1ND4CNxEOAxUUFjMy
+ PgI3DgEjIiYnFRQOAiMiLgI1Ex4BFz4DNz4DNTQuAiMiDgIEmCU1Cw0eTEItHjhPMA8gIBsK
+ EyZCVjBTwc7UZkB2WzcybKt6ac61kf7XOGdOLwcSHhcbaoGJOQI6rYEjRyZAbVAsIEFiQhlb
+ Y14cDBweHQwGDAYXQyQECAMVP01W/skpHg8WGAhQfVcuam9EmaChSxMkEVifQg4VGQoJDgsF
+ VAYIAyNSTkUWMEAmECAzPh0pVE5DBUIRHQ0WCAkFDDFObEY9f4GBPgQODAkRFSYkIA5Vkms9
+ IEp7XE+0xNFsXoVWKP5gGC9GLg4ZGBoPEiorKA8OGw4iLAkIQIyTlko2X0coEiM1Iw8bFQ0E
+ KioIFA0LGBQN/eMrLREHDw0KAgE1VKeflUJvfCdHYz0DARsgpQ0eGRArPkYbAdUuUycKFhYT
+ Bw8bGRYKERkRCAkTHgAAAAABAJgEQgOLBQQAIAAXALsADwADABoABCu4ABoQuQAFAAH0MDET
+ Mh4CMzI+Ajc+AzMyFhUUBgcOAyMiNTQ+AqoFCRMlIg1DT0oVQGRSRiMRCx4uGWeTt2l0AgQH
+ BNEHBwcGCQkDCRAMCBALEyoQCB4eFkEJGhkSAAACADkCdwPjBUwAHwA0AR24ADUvuAA2L7gA
+ NRC4ABbQuAAWL7gANhC4AArcugACABYAChESObkAIAAH9EEFABoAIAAqACAAAnFBIQAJACAA
+ GQAgACkAIAA5ACAASQAgAFkAIABpACAAeQAgAIkAIACZACAAqQAgALkAIADJACAA2QAgAOkA
+ IAD5ACAAEF1BAwAJACAAAXG4AAXQuAAFL7gAFhC5ACwABPRBIQAGACwAFgAsACYALAA2ACwA
+ RgAsAFYALABmACwAdgAsAIYALACWACwApgAsALYALADGACwA1gAsAOYALAD2ACwAEF1BAwAG
+ ACwAAXFBBQAVACwAJQAsAAJxuAAT0LgAEy8AuwAuAAEAEwAEK7sABQADACUABCu6AAIAJQAF
+ ERI5MDEBMhc+ATMyHgIVFA4GIyImNTQ+Ajc+Axc0JicGBw4FFRQzMj4EAt8VEAYkKhsyJxcv
+ UW5/ioiBNzg7OVptNCpsaVuLIBEIFyR0hIdtRCMieo6TeEwFLw4RGhMjMyAlWWBjXFE7I0A7
+ KmZpYiYfQjckph0dCxMBAjFNXmFaIRstSFtdVwABAET/lAThBNUAZgCiuwAKAAcAZAAEK0Eh
+ AAYACgAWAAoAJgAKADYACgBGAAoAVgAKAGYACgB2AAoAhgAKAJYACgCmAAoAtgAKAMYACgDW
+ AAoA5gAKAPYACgAQXUEDAAYACgABcUEFABUACgAlAAoAAnG4AAoQuAAg0LgAIC+4AAoQuQBf
+ AAT0uQAjAAf0uABfELgASNC4AEgvALgAAC+4ADkvuwBVAAMATQAEKzAxATIeAhUUHgIXPgUz
+ Mh4CFRQOAgcOAwceARc+AT8BPgEzMhYVFA4CBw4FIyIuAjU0PgI3LgMnDgMjIiY1ND4CMzI+
+ BDcyNjMuAzU0NgJaBx8gGAIEBwYoXV1YSDIIFCEYDREbIRELTXWUUQULBjxtKJYGDQYKEStF
+ Vywobnt/cFgYFSohFC9ssoMBAgUKCT+AenIwHyIlOEEcCzA+SEU8FAICAggKCAMMBNUYLUEo
+ DC5NdFMKFxcVEAkPFxsMDBINCAMCEx0kEn76gAgYCysCAgsOEisqJgwMGRkXEQoGER0XGBwV
+ FBIGMnC4jQ4XEgoUEyIlEgMGCg0NDQYCiatmMhIgGwAAAQAnAZMDXAUGAE4AfrsASgAEACgA
+ BCtBBQAaACgAKgAoAAJxQSEACQAoABkAKAApACgAOQAoAEkAKABZACgAaQAoAHkAKACJACgA
+ mQAoAKkAKAC5ACgAyQAoANkAKADpACgA+QAoABBdQQMACQAoAAFxuABKELgAUNwAuAAZL7sA
+ RQADACsABCswMQEOAwclNjMyFhUUDgIHDgcjIi4CNTQ+Ajc+AzU0JiMiDgQVFhUUDgIjIi4C
+ NTQ+BDMyHgIVFA4CAboXOzw5FgJCEgsQEAcPGBEGP2B3e3ZeOwQMGhcPQWN1M0lpRCARDiJQ
+ UEs6IwQRFxYFBRMUDidDW2hyOCs8JRAwVXUC7BErLzAWewUUGAkcHBkGAhAWHBwbFA0QGiAP
+ IFZcWyY1Xk88FAgOEBkfHhkGCAQKEQ0HEBgdDQssNTctHRkoMhoqYGZqAAAAAQA5AYUDewTd
+ AFkAvLsADAAFACUABCtBBQAaACUAKgAlAAJxQSEACQAlABkAJQApACUAOQAlAEkAJQBZACUA
+ aQAlAHkAJQCJACUAmQAlAKkAJQC5ACUAyQAlANkAJQDpACUA+QAlABBdQQMACQAlAAFxuAAM
+ ELgAW9wAuAAAL7sAGwADABEABCu7AFIAAQBCAAQruwAHAAEAKgAEK7gAERC5ACAAA/S6AD8A
+ QgBSERI5uABCELkATAAD9LgAUhC4AE/QuABPLzAxATIVFA4CBx4DFRQOAiMiLgI1ND4CMzIe
+ AjMyPgI1NC4CIyIOAgcOASMiJjU0Njc+BTcOASMiLgI1ND4CMzIWFx4BMzI+Ajc+AQNOLUVm
+ djFUbEAZO3OrcDtzWjgUICgTESU1STVMe1YvMUpUIhg7PTcTEiUSEB4RDAY9V2RYQAhFgDNP
+ XTEOEx8nExwzFCVOGiZUTkASHToE3SUWQUdGHAMnPEwnO3tkQBchJA0KHhsTEhURIDZGJyMs
+ GAkIDhMKChMYEQsYBwMjMzo0JwcMDAsTGA0MHRsSDgwFAQkPEQgJCwABATgDtgN5BhwAHQAL
+ ALgAEC+4ABwvMDEBHgEVFAYHDgUHDgEjIjU0Nz4DNz4BMzIDbQUHERQWSFZdU0MRESYPHjU6
+ gHdmIQoUCxIGAgwXDRIsHR9OVVRJOQ4ODRYcLzN/g34yDhIAAAEAzP2yBKQD+gBZATW7AD4A
+ BwBVAAQruwAfAAcAFwAEK7gAVRC4AADQuAAAL0EhAAYAPgAWAD4AJgA+ADYAPgBGAD4AVgA+
+ AGYAPgB2AD4AhgA+AJYAPgCmAD4AtgA+AMYAPgDWAD4A5gA+APYAPgAQXUEDAAYAPgABcUEF
+ ABUAPgAlAD4AAnG4AD4QuAAK0LgACi+4AD4QuAAN0LgADS9BBQAaABcAKgAXAAJxQSEACQAX
+ ABkAFwApABcAOQAXAEkAFwBZABcAaQAXAHkAFwCJABcAmQAXAKkAFwC5ABcAyQAXANkAFwDp
+ ABcA+QAXABBdQQMACQAXAAFxugA0ABcAHxESObgAVRC4AEvQuABLL7gAHxC4AFvcALgASC+4
+ AAUvuwASAAMAOQAEK7oANABIAAUREjm6AD4ASAAFERI5MDETND4CMzIeAhUUBhUUHgIzMj4C
+ Nz4DMzIWFRQGBx4FFx4BFRQGIyIuAicOAyMiLgInHgMVFA4CIyImNTQ+AjU0LgI1ND4C0wcO
+ FxETHBIJBCpDVSohV2NoMwEOJD4xJSU+MwEIDhISEgcFAxsaDykoJQwuaGprMSZBNy8SAwkJ
+ BwoVIRgjFgMDAwcIBwIDAgMzR1AnCR0zRiojQzBouIpQNWWPWkiIaD8gGkW7ZB1NVlpTRhgO
+ HA0jL057lklDdVgzIDdKKU2Zi3QnNmhTMkw9JVZQQQ8JWYmrXDyBf3kAAAAAAgBM/wYEWQXl
+ AGwAfgFSuwB5AAcAIwAEK7sADwAHABwABCu7AGcABABFAAQruABFELgAA9C4AAMvuABFELgA
+ CNC4AAgvugAJAEUAZxESObgADxC4AAzQuAAML7gAHBC5ABQAB/S4AA8QuAA60LgAOi+4AA8Q
+ uAA/0LgAPy+4AA8QuABC0LgAQi+4AGcQuABb0LgAWy+4AGcQuABe0LgAHBC4AG3QuABtL7oA
+ cgAcAA8REjlBIQAGAHkAFgB5ACYAeQA2AHkARgB5AFYAeQBmAHkAdgB5AIYAeQCWAHkApgB5
+ ALYAeQDGAHkA1gB5AOYAeQD2AHkAEF1BAwAGAHkAAXFBBQAVAHkAJQB5AAJxuABnELgAgNwA
+ uAAqL7gALC+4ABcvuwB8AAEAIAAEK7oACQAXACwREjm6AB0AIAB8ERI5ugBCABcALBESOboA
+ XwAXACwREjm6AHIAFwAsERI5MDElIiY1ND4CPQEOAQcWFBUUHgIVFAYjIi4CPQEOASMiJjU0
+ PgQ3NjMyFhUUBgcOAwceARUUDgIVHAEXPgE3NTQ+Ajc+AzMyHgIVFAYHBhQVFBYdATc2MzIV
+ FAYHERQOAgE+AzcOBRUUFjMyNgOiEQwDBAM5gkkCDQ8NEBkYLyYYO3o/ZmJMgKazs00sGRkf
+ GyUpR0dIKgYEAgECAUSCPAUKDggMGhkVBgYOCgcXFgIEJRYNCyopERwk/lcCCQwPCSdUT0c2
+ HysxNW0ZTj4nW15fLMUzXyYqRhV0x5tlERwqUaDunmAUF19kVravooViGA4aFxErHB8jHR4a
+ FzweL0A8QzAnUSgjWTCqJlZOQBAWHhEHExocCRMQBgcVDiVwQS0lFhAWQi/9YB82KRcCQ06h
+ lYEwIFFcYmFbJx8xFwAAAQFoAYkCbQKgAA8AWboAAwAKAAMrQQUA2gAKAOoACgACXUEbAAkA
+ CgAZAAoAKQAKADkACgBJAAoAWQAKAGkACgB5AAoAiQAKAJkACgCpAAoAuQAKAMkACgANXQC4
+ AAAvuAAILzAxATIWFRQOAiMiNTQ2Nz4BAi8WKCs9QhdEJzIZPgKgJi4iRTgkPi5UKhUYAAAA
+ AAEAYv4vAxsAywAiAHa7AAoABQAgAAQrQQUAGgAgACoAIAACcUEhAAkAIAAZACAAKQAgADkA
+ IABJACAAWQAgAGkAIAB5ACAAiQAgAJkAIACpACAAuQAgAMkAIADZACAA6QAgAPkAIAAQXUED
+ AAkAIAABcQC4AAUvuwAbAAEADwAEKzAxJSY1NDYzMhceARUUDgIjIi4CNTQzMh4CMzI+AjU0
+ JgKgDRANERAlJU6BqVs4VjoeFQkQIDozYp5vOxKRChANEw8gYTtlq3xFHC06HS0bIBtDbIpI
+ IjYAAAABAKoBdwFeBRkAKgCIuwAOAAQAIQAEK0EhAAYADgAWAA4AJgAOADYADgBGAA4AVgAO
+ AGYADgB2AA4AhgAOAJYADgCmAA4AtgAOAMYADgDWAA4A5gAOAPYADgAQXUEDAAYADgABcUEF
+ ABUADgAlAA4AAnG4AA4QuAAJ0LgACS+4AA4QuAAQ0LgAEC8AuAAcL7gAAC8wMQEyFhcUDgIP
+ AQ4DFRQXNjMyFRQGBw4DIyIuAjU0PgI3PgMBOw4SAwMEBgMbBAUDAgYXDA4YCwYQFBoSDxYO
+ BgkOEwsDGx8bBRkPEgEWIy0YvRlQYWkzKhwKDg4rDg4cFg4FIUhCVKuooUkMIR4WAAMAQgEr
+ AxkEywAVAC8ATQEnuABOL7gATy+4AAXcuABOELgAD9C4AA8vuQAjAAb0QSEABgAjABYAIwAm
+ ACMANgAjAEYAIwBWACMAZgAjAHYAIwCGACMAlgAjAKYAIwC2ACMAxgAjANYAIwDmACMA9gAj
+ ABBdQQMABgAjAAFxQQUAFQAjACUAIwACcbgABRC5AC0ABfRBBQAaAC0AKgAtAAJxQSEACQAt
+ ABkALQApAC0AOQAtAEkALQBZAC0AaQAtAHkALQCJAC0AmQAtAKkALQC5AC0AyQAtANkALQDp
+ AC0A+QAtABBdQQMACQAtAAFxuAAw0LgAMC+4AAUQuAA10LgANS+4AA8QuABE0LgARC8AugAm
+ AD8AAyu7AAAAAQAWAAQruwAwAAIAOgAEK7gAJhC5AAwAAvQwMQEyHgIVFA4EIyImNTQ+BBci
+ DgIHDgEHDgMVFBYzMj4ENTQmEzIeAhUUDgIjIg4CIyIuAjU0Njc+BQJtKUAsFzpeeHt2LFdT
+ MVNve4FCFywpJREQHxEwVD8kIx8kYWdlUDEsMwwcFxALERYLPpKZmUQXGg0DFhMMU3OFe2ME
+ yxksOyJIgm9aPyJKWD57b19GJ2sQGiAQDwoEC0NVWyQfIyE5TFlfLywi/ZIECg8KChMOCCIp
+ IgwUFwsVGQMCDhMUEgsAAAACAEoAcgS4A5wALwBdAAsAuAA1L7gATy8wMTcOASMiJjU0PgI3
+ PgM3LgUnLgM1ND4CMzIeAhceARUUBw4DBQ4DIyImNTQ+Ajc+AzcuBScuATU0NjMyHgIXHgEV
+ FAcOA9kJJxUcLhYmLxowU1hlQQ45S1VSSBkNIBsSFCAoFSZGZZl5Ihc5RoN3agGLBhccHQsR
+ FRUiLhgwWmFsQQ42RVJUUiMaKjAqIFR0nWkgGTlGh35z0QIFDxcUFg4LCA8hLkIxDiQpKiUe
+ CQQNDxEJDhUNBw8uU0MTKBk9MDpRNiBSAgcHBQsQFBwWEwwWO0hWMQ0sNDk2Lg8LHxMdFyVJ
+ bEcWJRk9MDpkTzgAAAAABACB/poGjQV1AFIAdQCiAKsARwC4AFMvuABkL7sAEgADAJQABCu6
+ AA0AlAASERI5ugAzAGQAUxESOboAUABkAFMREjm6AKMAZABTERI5ugCoAJQAEhESOTAxATIe
+ AhUUBgcOAwc+AzMyHgIVFA4CBw4DBw4DBw4DIyImNTQ+AjcOAQcOAyMiLgI1NDc+BT8BPgEz
+ MhYXPgEDMhUUBgcOBQcOAyMiJjU0Njc+BTc+AwUyFhcUDgIPAQ4DFRQXNjMyFRQOAgcOAyMi
+ LgI1ND4CNz4DAQ4DBz4BNwT2ChkVDwkHAwYICQUyXlFBFA0bFA0OExcJGEZXYzYDBQYHBgYY
+ GhgGDAkDCRAMasFEEhgRDwoJDwsGMRFDUVhPPg4QDBALBRcJBQ5bJysjIW6KnJ+aQS0sGhUV
+ CxIoNDWLmqGXhTEWHBYV/NAOEgMDBAcDGgMGBAIHFwwOBwoMBgYQFBsRDxYOBggPEwsDGx8b
+ A3sURk9MGjh4RAM3EhsgDg0WCwQqPkkiCQ4KBhMZGwkLDggDAQIHCxAJIFRXTxkbKBsNERAB
+ JVWMaBIpEQUJCAUUHB4KLgwFM0lWUUQTEg4VEgsRFgI+ThhYQDyat9Hj8n1Wc0YeKCczn2ps
+ 2tfQxblTJTckElwPEgEWIy0YvRlQYWkzKxsKDQcTFBMHDhwWDgUhSEJUq6ihSQwhHhb9jxxL
+ TkYXDBgNAAMAgf6aBhQFdQAiAE8AngAfALgAAC+4ABEvuwCVAAMAewAEK7oAVQARAAAREjkw
+ MQEyFRQGBw4FBw4DIyImNTQ2Nz4FNz4DBTIWFxQOAg8BDgMVFBc2MzIVFA4CBw4DIyIuAjU0
+ PgI3PgMBDgMHJTYzMhYVFA4CBw4HIyIuAjU0PgI3PgM1NCYjIg4EFRYVFA4CIyIuAjU0PgQz
+ Mh4CFRQOAgSRJysjIW6KnJ+aQS0sGhUVCxIoNDWLmqGXhTEWHBYV/NAOEgMDBAcDGgMGBAIH
+ FwwOBwoMBgYQFBsRDxYOBggPEwsDGx8bAyUXOzw5FgJBDw4QEAcPGBEGQGB2e3ZdPAQMGhcP
+ QWN1M0hqRCERDiJQUEw6IwQRFxYFBRMTDydDW2lxOSs7JRA2WHQFdU4YWEA8mrfR4/J9VnNG
+ HignM59qbNrX0MW5UyU3JBJcDxIBFiMtGL0ZUGFpMysbCg0HExQTBw4cFg4FIUhCVKuooUkM
+ IR4W/AoRKy4wFnsEExgJHB0ZBgIPFxscGxUMEBkgDyFWXFsmNV9OPBMIDhAZHx4ZBgUHChEN
+ BxAYHQ0LLDU3LR0YKDMaKWVqaAAAAAAEADn+mgfVBXUAUgBbALUA2AClALgAti+4AMcvuwCu
+ AAEAngAEK7sAYwABAIYABCu7AHcAAwBtAAQruACGELgAANC4AAAvugANAG0AdxESObgAbRC5
+ AHwAA/S4ABLQuAASL7gAbRC4ABzQuAAcL7oAMwDHALYREjm6AFAAxwC2ERI5ugBTAMcAthES
+ OboAWABtAHcREjm6AJsAngCuERI5uACeELkAqAAD9LgArhC4AKvQuACrLzAxATIeAhUUBgcO
+ Awc+AzMyHgIVFA4CBw4DBw4DBw4DIyImNTQ+AjcOAQcOAyMiLgI1NDc+BT8BPgEzMhYXPgEH
+ DgMHPgE3ATIVFA4CBx4DFRQOAiMiLgI1ND4CMzIeAjMyPgI1NC4CIyIOAgcOASMiJjU0Njc+
+ BTcOASMiLgI1ND4CMzIWFx4BMzI+Ajc+ASUyFRQGBw4FBw4DIyImNTQ2Nz4FNz4DBj4KGRUP
+ CQcDBggJBTJeUUEUDRsUDQ4TFwkYRldjNgMFBgcGBhgaGAYMCQMJEAxqwUQSGBEPCgkPCwYx
+ EUNRWE8+DhAMEAsFFwkFDiMURk9MGjh4RP1YLUVmdjFUbEAZO3OrcDtzWjgUICgTESU1STVM
+ e1YvMUpUIhg7PTcTEiUSEB4RDAY9V2RYQAhFgDNPXTEOEx8nExwzFCVOGiZUTkASHToCmScr
+ IyFuipyfmkEtLBoVFQsSKDQ1i5qhl4UxFhwWFQM3EhsgDg0WCwQqPkkiCQ4KBhMZGwkLDggD
+ AQIHCxAJIFRXTxkbKBsNERABJVWMaBIpEQUJCAUUHB4KLgwFM0lWUUQTEg4VEgsRFo8cS05G
+ FwwYDQMWJRZBR0YcAyc8TCc7e2RAFyEkDQoeGxMSFREgNkYnIywYCQgOEwoKExgRCxgHAyMz
+ OjQnBwwMCxMYDQwdGxIODAUBCQ8RCAkLmE4YWEA8mrfR4/J9VnNGHignM59qbNrX0MW5UyU3
+ JBIAAgBO/nUDtgPfAFAAYwE9uwAzAAUABQAEK7oAXgBWAAMruwBKAAYAPQAEK0EhAAYAMwAW
+ ADMAJgAzADYAMwBGADMAVgAzAGYAMwB2ADMAhgAzAJYAMwCmADMAtgAzAMYAMwDWADMA5gAz
+ APYAMwAQXUEDAAYAMwABcUEFABUAMwAlADMAAnFBBQAaAD0AKgA9AAJxQSEACQA9ABkAPQAp
+ AD0AOQA9AEkAPQBZAD0AaQA9AHkAPQCJAD0AmQA9AKkAPQC5AD0AyQA9ANkAPQDpAD0A+QA9
+ ABBdQQMACQA9AAFxuAA9ELgAQNC4AEAvQQUA2gBWAOoAVgACXUEbAAkAVgAZAFYAKQBWADkA
+ VgBJAFYAWQBWAGkAVgB5AFYAiQBWAJkAVgCpAFYAuQBWAMkAVgANXbgAShC4AGXcALgAWy+7
+ ADYAAwAAAAQrMDETIi4CNTQ+Ajc+AzciDgIHDgEjIiY1NDY3PgUzMh4CFRQOAgcOAxUUFjMy
+ PgQ1NCY1ND4CMzIeAhUUDgQTIi4CNTQ+AjMyFhUUBgcOAfglPi0aP3CbXBMpIRYBGFFWSA8I
+ DgYPDicoDS85PjguDAwkIBcHKVdQU4liNRojOYiHfmI6BRQbGQUGDQsHOWSInKmHCxYRCys8
+ QhciIicxGj7+dR0wQCM8iY+PQg4gISEPCw8OAwICDxMaMw4ECQgHBQMGEB0YEzJCVjY4d29i
+ IhcoHzA7OC4MAwcDCQ0JBRIcIhAQQEtPQSkEVAkUIBciRTgjHSAvUyoWFwAAAP//ACP/bQVC
+ B1MCJgAiAAAABwBBAMEBP///ACP/bQVCB1UCJgAiAAAABwCPADsBOf//ACP/bQVCBx4CJgAi
+ AAAABwBnALABOQACACP/bQVCBtAAiACXADMAuAAPL7gAPS+7AAUAAQB+AAQrugBfAD0ADxES
+ OboAjgA9AA8REjm6AJMAPQAPERI5MDEBPgMzMhYXFjMyNjc2MzIVFAYHDgEHDgMVFBYXHgEX
+ PgM3NjMyFRQOAgceAxceAxUUBiMiJicuBScOAwcOAQcOAyMiLgI1NDY3PgE3DgEjIi4CNTQ+
+ Ajc+Azc+BTcuAScuASMiBgcOASMiNTQ2AS4DJw4DBz4DAWYkTExKIydFHBwwM45bJxQMGRpd
+ oT8DEREOGQ4XOSA5W1NRLwkGEkFogkAXMDIyGgwbFw8eFyJBEg8kJyklIQw4a3aKVhgzIg4Q
+ DA0KCx0aEhcWBRkTFh4KGCcdEBAyXk0fQz84EwkhKS4tKRADAwIeMBojX08RIQsYCwHyFCcj
+ HgsfTE5HGStnbW4FjTddQiUzODlsWiYQDzMid3gFChwiKRYyczZd2nMOGBYXDQMNCy43NxNO
+ l4d0LBUcFQ8IDxMNFxJPZ3Z1aicSHRwcEDyNXiY2JBEbKTAVKUs2DDgpAgITHCANFA4GBg1A
+ iYFvJhJNYWthTBIDCAMzM19hFBIbDCH8ykmXkYY4QquwpT0HEhUXAAAA//8AI/9tBUIGmQIm
+ ACIAAAAHAIMAxQEGAAMAI/9tBUIG9gB7AI8AngEMuwAJAAUAfAAEK7oAFQB1AAMrQRsABgAV
+ ABYAFQAmABUANgAVAEYAFQBWABUAZgAVAHYAFQCGABUAlgAVAKYAFQC2ABUAxgAVAA1dQQUA
+ 1QAVAOUAFQACXboAbwB1ABUREjlBBQAaAHwAKgB8AAJxQSEACQB8ABkAfAApAHwAOQB8AEkA
+ fABZAHwAaQB8AHkAfACJAHwAmQB8AKkAfAC5AHwAyQB8ANkAfADpAHwA+QB8ABBdQQMACQB8
+ AAFxuAB1ELkAhgAF9LoAlQB1ABUREjm4AAkQuACg3AC4AAYvuAA2L7oAWAA2AAYREjm6AG8A
+ NgAGERI5ugCVADYABhESOboAmgA2AAYREjkwMQEyFhc+ATMyFhUUDgIHFhUUDgIVFBYXHgEX
+ PgM3NjMyFRQOAgceAxceAxUUBiMiJicuBScOAwcOAQcOAyMiLgI1NDY3PgE3DgEjIi4CNTQ+
+ Ajc+Azc+AzcOASMiJjU0PgQXNC4CJw4DFRQWMzI+BAMuAycOAwc+AwM7CxMJCh8ZMTcdMkQn
+ BhETERkOFzkgOVtTUS8JBhJBaIJAFzAyMhoMGxcPHhciQRIOJCgoJiEMOGt2ilYYMyIOEAwN
+ CgsdGhIXFgUZExYeChgnHRAQMl5NH0M/OBMKJCwyGBMmEVNHK0RVVUyLExobCDJxYEAXICVR
+ TUY0H2IUJyMeCx9MTkcZK2dtbgbnBQULDjssIUZFQBwJDQkcJiwZMnM2XdpzDhgWFw0DDQsu
+ NzcTTpeHdCwVHBUPCA8TDRcSTmd3dWonEh0cHBA8jV4mNiQRGykwFSlLNgw4KQICExwgDRQO
+ BgYNQImBbyYTVmpzMQUFPzgqU0k+LhluDgoGBgkFMEVQJhQZGCczNTT73kmXkYY4QquwpT0H
+ EhUXAAAAAAMAI/+mCBwFsAB8AIgAuAC/ALgADi+4ADMvuAAARVi4AHgvG7kAeAAIPlm7ACQA
+ AwAcAAQrugAZABwAJBESObgAJBC4ACfQuAAnL7oAQAAOADMREjm4AHgQuQBjAAP0QSEABwBj
+ ABcAYwAnAGMANwBjAEcAYwBXAGMAZwBjAHcAYwCHAGMAlwBjAKcAYwC3AGMAxwBjANcAYwDn
+ AGMA9wBjABBdQQMABwBjAAFxQQUAFgBjACYAYwACcboAfQAOADMREjm6AIMADgAzERI5MDEl
+ LgEnDgMHAw4DIyIuAjU0Njc+ATcGIiMiLgI1NDYzMjY3PgM3PgUzMh4CFRQOAhUUFhc+ATc+
+ BTMyHgIVFAYrASIOBCsBHgMXHgEzMj4ENzYzMhYVFAcOBSMiLgIBPgE3JgInDgMHASIOBAcO
+ BSMiLgI1ND4CMzI+Ajc+ATMyHgIVFA4CIyImNTQmA8kXMxksdIWPSGYOEAwNCgsdGhIXFgUX
+ ExAeDhgnHRAnIyhNJh9GQjkUCiYwNDEpDAcgIRoRExECAhk9GSJcaG9pXiMwYk8zHBGbMIOR
+ kn9gFhcXPUVNJwkgEil3j6Gnp00NCQsJEEyora2hjzgmLx4S/c+G30smSh0fRUVAGQWODT5Q
+ WlRFExNIWGBWQg8XGw0DAQgRDw9Ob4lLkNNLJTAcCgwPDwMGDwh1Ua5dEiUhHQr+5SY2JBEb
+ KTAVKUs2DDgnAhMcIA0aCwICQY+GdCcUWnB4YkAEDRkVCRwmLBkPIRENEQUGDQwKCAQNFyAS
+ EwoNFBgUDV7q9e9jFxQQHiw4QycGDAgSCzddSzgmExIjMAF+ESoNkwEql0KbnZU9AU4LEBQT
+ EAQEEBMUEQoMFBYLCxINBxQdIg4cFwkSGRAQFw8HBw8LBgABADn+LwV8BRQAWwGBuABcL7gA
+ XS+4AFwQuAAK0LgACi+4AF0QuABD3LkAWQAF9EEFABoAWQAqAFkAAnFBIQAJAFkAGQBZACkA
+ WQA5AFkASQBZAFkAWQBpAFkAeQBZAIkAWQCZAFkAqQBZALkAWQDJAFkA2QBZAOkAWQD5AFkA
+ EF1BAwAJAFkAAXG4ACHQuAAhL7gAChC5ACoABfRBIQAGACoAFgAqACYAKgA2ACoARgAqAFYA
+ KgBmACoAdgAqAIYAKgCWACoApgAqALYAKgDGACoA1gAqAOYAKgD2ACoAEF1BAwAGACoAAXFB
+ BQAVACoAJQAqAAJxugBAAEMAWRESOQC4AABFWLgABS8buQAFAAg+WbsAVAABAEgABCu7ABQA
+ AwAeAAQruAAFELkALwAB9EEhAAcALwAXAC8AJwAvADcALwBHAC8AVwAvAGcALwB3AC8AhwAv
+ AJcALwCnAC8AtwAvAMcALwDXAC8A5wAvAPcALwAQXUEDAAcALwABcUEFABYALwAmAC8AAnEw
+ MSUOAyMiLgI1ND4CNz4DMzIeAhUUDgIjIiYnDgcVFB4CMzI+BDc2MzIVDgEHDgEHHgEVFA4C
+ IyIuAjU0MzIeAjMyPgI1NCYDhVKnoJVARFYyEjx1rHBst5NsIA8jHhQfLzcXEjMZEFV1i42D
+ Zj0LHDAmO6W9zse5ShYODAEPElXRcyAfTYKpWzhVOh4UChAfOjNinm87EZEsSDMbIDxUM1S1
+ vsVkYIxaLBgiJAwNKCUbBQoIPF54iJGRiTsbLR8RJkNbaHE4EAwIHhJVnEIgXDZlq3xFHC06
+ HS0bIBtDbIpIIjYAAAD//wDT/+cF7wdNAiYAJgAAAAcAQQDDATn//wDT/+cF7wdVAiYAJgAA
+ AAcAjwCFATn//wDT/+cF7wceAiYAJgAAAAcAZwCJATn//wDT/+cF7wZyAiYAJgAAAAcAgwC+
+ AN/////Z/48ClgdNAiYAKgAAAAcAQf8TATn//wAO/48CTwdVAiYAKgAAAAcAj/7WATn////u
+ /48CVwceAiYAKgAAAAcAZ/7aATn//wAR/48CTAbMAiYAKgAAAAcAg/8PATkAAgAf/7IFmgVc
+ ACcAcgEpuwAUAAcAVQAEK7sARwAFAB4ABCtBIQAGABQAFgAUACYAFAA2ABQARgAUAFYAFABm
+ ABQAdgAUAIYAFACWABQApgAUALYAFADGABQA1gAUAOYAFAD2ABQAEF1BAwAGABQAAXFBBQAV
+ ABQAJQAUAAJxuAAUELgAA9C4AAMvugAXAFUARxESOUEFABoAHgAqAB4AAnFBIQAJAB4AGQAe
+ ACkAHgA5AB4ASQAeAFkAHgBpAB4AeQAeAIkAHgCZAB4AqQAeALkAHgDJAB4A2QAeAOkAHgD5
+ AB4AEF1BAwAJAB4AAXG4AEcQuAB03AC4ADUvuABQL7sAQAADACMABCu7AG8AAQBjAAQrugAX
+ AFAANRESObgAYxC4AGDQuABgL7gAbxC4AHLQuAByLzAxAR4BFzc+AzcyFhUUBgcOAwceARc+
+ BTU0LgIjIg4CByIuAjU0Ny4BNTQ2MzIeAh8BPgMzMh4EFRQOBiMiLgI1ND4CNy4DLwEGIiMi
+ NTQ+AjMyHgIzMjY3AUYJFAorQGRSRSMRCx0uEj9Waz4JCwJj2NK+kFVbq/abQ2xWQpAKEg0I
+ IwQCCA4LHRwVAwgoVlBCFW3RuZtwPkyCrMPMwao/FSMZDw0iOSwFBQMCAgwaNRx0AgQHBQUJ
+ EyYiCzAfBBBb0mwGCRAMBwEQCxMqEAYTFRYIdMxFHWB2gn5wKi9yZEMJDxRLCBcnICIaJkMm
+ JTcQHSkaSAoMCAMkQ190hkk2fIKCdmdMKxskJgwWDwMBCCJJRj4VkQJCCBsZEgcHBwMDAAAA
+ //8A1v+HBRgG/QImAC8AAAAHAHQBKwFz//8AOf/4BR8HTQImADAAAAAHAEEAjQE5//8AOf/4
+ BR8HVQImADAAAAAHAI8AuAE5//8AOf/4BR8G5QImADAAAAAHAGcA0wEA//8AOf/4BR8GngIm
+ ADAAAAAHAHQBHwEU//8AOf/4BR8GPgImADAAAAAHAIMBbQCrAAEATABaA5EEkQBJAAsAuAAT
+ L7gAOS8wMRM0NjMyHgIXHgEXPgE3PgMzMhYVFAYHDgEHHgEXHgMVFA4CIyIuAicuAScOAQcO
+ AyMiLgI1NDY3PgE3Jy4DTAoMBx0mLhoZXjtKiDQXIBoWDhMTIh0vh0g0bTAhQTQgBw0SCxE6
+ Q0UcJ1cwKUkeNDkhFhIHEA8KMEEqUChtJz4rFwRWCg8ZLT4kI3VGTYpMITIhER0hMWcoQo9L
+ PHMyIj40JwsJExELKTxHHipiOS1YLU1sQx8MGiofNJBUNl0sjTJjUjkAAAAAAwA5/uEFHwW8
+ ADQAQwBhARW4AGIvuABjL7gAE9y4AGIQuAAq0LgAKi+4ABMQuQA1AAb0QQUAGgA1ACoANQAC
+ cUEhAAkANQAZADUAKQA1ADkANQBJADUAWQA1AGkANQB5ADUAiQA1AJkANQCpADUAuQA1AMkA
+ NQDZADUA6QA1APkANQAQXUEDAAkANQABcboAPQAqABMREjm4ACoQuQBEAAb0QSEABgBEABYA
+ RAAmAEQANgBEAEYARABWAEQAZgBEAHYARACGAEQAlgBEAKYARAC2AEQAxgBEANYARADmAEQA
+ 9gBEABBdQQMABgBEAAFxQQUAFQBEACUARAACcboATwAqABMREjkAuAAFL7gAHy+6AD0AHwAF
+ ERI5ugBPAB8ABRESOTAxAT4DMzIWFRQGDwEUFx4DFRQOBAcOAyMiJjU0NjcuAzU0Ejc+AzMy
+ FhM0JicOAgIHPgUBFBYXPgE3PgM3DgMHDgEjIiYjIgYHDgMEOxkmIR0REhUqJCEKGjUqG1CL
+ u9TibSgoGRQUDBEVGiU/LxvByVGwoYQlDRWINTs/p7e4UVG0sKB5SPvqLTsCBQM9pbW4URw+
+ OzMRFTcVBQsFEykdUoZeNAT2Jkc4IScmF148NwoCCiY+WT1ezMWxiFIDT2xCHCknJmpFDClB
+ WTuLAVm8S3pWLwL+mzxVD1nb+f7ukBZfgp2mqP26SFcLBgoHffr1620GFB0kFRopAx0YRJma
+ lQD//wDZ/7wEzwcGAiYANgAAAAcAQQAXAPL//wDZ/7wEzwcOAiYANgAAAAcAjwDHAPL//wDZ
+ /7wEzwceAiYANgAAAAcAZwB9ATn//wDZ/7wEzwZuAiYANgAAAAcAgwCPANv//wAd/vAFTAdV
+ AiYAOgAAAAcAjwBaATkAAgBO/1gFKwUlAEEAVgGNuABXL7gAWC+4AFcQuAA60LgAOi+4AAPQ
+ uAA6ELgAB9C4AAcvuABYELgAGty4ADoQuQAnAAf0QSEABgAnABYAJwAmACcANgAnAEYAJwBW
+ ACcAZgAnAHYAJwCGACcAlgAnAKYAJwC2ACcAxgAnANYAJwDmACcA9gAnABBdQQMABgAnAAFx
+ QQUAFQAnACUAJwACcbgAJNC4ACQvuAA6ELgAMdC4ADEvuAA6ELgAN9C4ADcvuAAnELgAQtC4
+ AEIvuAAnELgARdC4AEUvuAAaELkATwAG9EEFABoATwAqAE8AAnFBIQAJAE8AGQBPACkATwA5
+ AE8ASQBPAFkATwBpAE8AeQBPAIkATwCZAE8AqQBPALkATwDJAE8A2QBPAOkATwD5AE8AEF1B
+ AwAJAE8AAXEAuAAKL7gALC+7AEgAAwAhAAQruwAQAAIAUgAEK7gAEBC4AADQuAAAL7gAEBC4
+ AAPQuAADL7gAUhC5ABUAAfS4ACEQuAAk0LgAJC+4ABAQuQBCAAP0uAA60LgAOi8wMRM6ATc1
+ NCY1NDYzMhYXHgEXPgMzMh4CFRQOBCMqAScWFBUUDgIjIi4CPQEmNTQ2NzQmNS4DNTQ2BR4B
+ Fx4BMzI+BDU0JiMiDgKBHTocAggOFzINBAUDVZ6Rhz9skFckSX+pwc5kEycSAhEbIhAOEQgC
+ GQsOAh87Lx0aAQcDAwIRJRZbuaqUbT9vd02am5wDhQLwLD0UHBVPUReFXgYODgkPIjgoRId8
+ a1AtAlp/FypCLRceOFAx9hUqHBkFWLRYAhYdHQoWEX9bvVsCAihBVFlVIxUaEhgXAAEAx/28
+ BS8FCABxAgq7AE8ABgBoAAQruwANAAQARQAEK7sAGAAFADAABCtBIQAGAE8AFgBPACYATwA2
+ AE8ARgBPAFYATwBmAE8AdgBPAIYATwCWAE8ApgBPALYATwDGAE8A1gBPAOYATwD2AE8AEF1B
+ AwAGAE8AAXFBBQAVAE8AJQBPAAJxuABPELgAANC4AAAvuABPELgAA9C4AAMvugASAGgAGBES
+ OUEFABoAMAAqADAAAnFBIQAJADAAGQAwACkAMAA5ADAASQAwAFkAMABpADAAeQAwAIkAMACZ
+ ADAAqQAwALkAMADJADAA2QAwAOkAMAD5ADAAEF1BAwAJADAAAXFBBQAaAEUAKgBFAAJxQSEA
+ CQBFABkARQApAEUAOQBFAEkARQBZAEUAaQBFAHkARQCJAEUAmQBFAKkARQC5AEUAyQBFANkA
+ RQDpAEUA+QBFABBdQQMACQBFAAFxuABoELkAWQAH9LgAaBC4AF/QuABfL7gAGBC4AHPcALgA
+ XC+4AABFWLgAIS8buQAhAAg+WbsACgACAEgABCu7ABUAAgAzAAQrugASADMAFRESObgAIRC5
+ ACkAA/RBIQAHACkAFwApACcAKQA3ACkARwApAFcAKQBnACkAdwApAIcAKQCXACkApwApALcA
+ KQDHACkA1wApAOcAKQD3ACkAEF1BAwAHACkAAXFBBQAWACkAJgApAAJxMDEBHAEXPgUzMhYV
+ FA4CBz4BMzIWFRQOBiMiLgI1NDYzMj4ENTQmIyIOAiMiJjU0PgI3PgM1NCYjIg4DAhUUHgQX
+ FhQVFAYjIiYnLgc1ND4CMzIeAgErAhtacYSLjkI6Qz9ph0hBlFSAjjxlhJCTgmcdGB4QBSAf
+ QKSpon5NW1lprYlpJRwWBREgGmm1hU0aJiqBkJF0SQMDBQQDAQEnGh0SBAECAgICAQEBAQkT
+ EhIVCwMDNyJlRmSxlXZSLD08So5+aSQRGmlaPHFoXE4/LBcYISQNGgsqR1xkZCwqNCMrIyQq
+ DBEPDwsre4N7KxUgNW+s7/7KwDNzc2xYPQsIDwc+Njk8D3CnztvYu44jIjkoFhktPAD//wA1
+ /7IEpAYyAiYAQgAAAAYAQXYeAAD//wA1/7IEpAYcAiYAQgAAAAYAjzUAAAD//wA1/7IEpAXl
+ AiYAQgAAAAYAZzUAAAD//wA1/7IEpAWKAiYAQgAAAAYAdGIAAAD//wA1/7IEpAWTAiYAQgAA
+ AAYAg28AAAD//wA1/7IEpAWyAiYAQgAAAAYA4TUAAAAAAwAM/8UHOQPPAG0AewCKAxK7AHoA
+ BAASAAQruwAmAAYAMwAEK7sAVgAHAAUABCu7AEwABQCIAAQrQQUA5gBWAPYAVgACXUEDAAYA
+ VgABcUEdAAYAVgAWAFYAJgBWADYAVgBGAFYAVgBWAGYAVgB2AFYAhgBWAJYAVgCmAFYAtgBW
+ AMYAVgDWAFYADl1BBQAVAFYAJQBWAAJxugAIAAUAVhESOboAHAAFAFYREjm4ABwvQQUAGgAc
+ ACoAHAACcUEhAAkAHAAZABwAKQAcADkAHABJABwAWQAcAGkAHAB5ABwAiQAcAJkAHACpABwA
+ uQAcAMkAHADZABwA6QAcAPkAHAAQXUEDAAkAHAABcUEhAAYAJgAWACYAJgAmADYAJgBGACYA
+ VgAmAGYAJgB2ACYAhgAmAJYAJgCmACYAtgAmAMYAJgDWACYA5gAmAPYAJgAQXUEDAAYAJgAB
+ cUEFABUAJgAlACYAAnG4ACYQuAAp0LgAKS+4ABwQuQA/AAT0ugBCABwAPxESOboAdQASAEwR
+ EjlBCwAGAHoAFgB6ACYAegA2AHoARgB6AAVdQRcAVgB6AGYAegB2AHoAhgB6AJYAegCmAHoA
+ tgB6AMYAegDWAHoA5gB6APYAegALXUEDAAYAegABcUEFABUAegAlAHoAAnG6AIEAEgBMERI5
+ QQUAGgCIACoAiAACcUEhAAkAiAAZAIgAKQCIADkAiABJAIgAWQCIAGkAiAB5AIgAiQCIAJkA
+ iACpAIgAuQCIAMkAiADZAIgA6QCIAPkAiAAQXUEDAAkAiAABcbgATBC4AIzcALgAOi+4AABF
+ WLgAAC8buQAAAAg+WbsAbgACAA0ABCu7AEcAAgAfAAQrugAIAAAAOhESOboAQgAAADoREjm4
+ AAAQuQBbAAP0QSEABwBbABcAWwAnAFsANwBbAEcAWwBXAFsAZwBbAHcAWwCHAFsAlwBbAKcA
+ WwC3AFsAxwBbANcAWwDnAFsA9wBbABBdQQMABwBbAAFxQQUAFgBbACYAWwACcboAdQAAADoR
+ Ejm4AB8QuAB80LgAfC+6AIEAAAA6ERI5MDEFIi4CNTwBNw4DIyIuAjU0PgQzPgE1NCYjIg4E
+ FRQWFRQOAiMiLgI1ND4EMzIeAhUUBgc+AzMyHgIVFA4EBw4BFRQeAjMyPgI3NjMyFRQGBw4F
+ JTI+BDcOAxUUASIOAgc+BTU0JgR1PoFoQgI/lqOtViMyIhBEdqG4yGMXGi03KGRoYk0vBBIW
+ FQQFEBAMMFVyhI5HMksxGQwLRaapo0I0Si4WTIKrv8ZcFBUXNFU+Wbatn0IZDAoPDx5WaHmC
+ ivvyJl5obWpiKZrrn1EF3zeVoJ0+UKCTfl01KR0eQ21PCRMJS4BfNhgqNyA5c2lbQyYwYTIz
+ LRonMS8mCgMGAwcMCAQPGB0ODjVAQzYjGS09JSVMJ0RwTywVJTIdMFtQRTIfAyZOJiM/Lxsw
+ UGo7Fg0LJRMmV1ZPPSRKGzNGV2Q2D1puah8lAzsrTGo/CiMrMC8qEBEeAAEANf4vBEIEEABV
+ AWm7ACQABwAKAAQruwA9AAUAUwAEK0EhAAYAJAAWACQAJgAkADYAJABGACQAVgAkAGYAJAB2
+ ACQAhgAkAJYAJACmACQAtgAkAMYAJADWACQA5gAkAPYAJAAQXUEDAAYAJAABcUEFABUAJAAl
+ ACQAAnG4ACQQuABH0LgARy9BBQAaAFMAKgBTAAJxQSEACQBTABkAUwApAFMAOQBTAEkAUwBZ
+ AFMAaQBTAHkAUwCJAFMAmQBTAKkAUwC5AFMAyQBTANkAUwDpAFMA+QBTABBdQQMACQBTAAFx
+ uAA9ELgAV9wAuAARL7gAEy+4AABFWLgABy8buQAHAAg+WbsATgABAEIABCu4AAcQuQApAAH0
+ QSEABwApABcAKQAnACkANwApAEcAKQBXACkAZwApAHcAKQCHACkAlwApAKcAKQC3ACkAxwAp
+ ANcAKQDnACkA9wApABBdQQMABwApAAFxQQUAFgApACYAKQACcTAxJSYnDgMjIiY1ND4ENzYz
+ MhYVFA4EBw4FFRQeAjMyPgQ3NjMyFRQOAgcXHgEVFA4CIyIuAjU0MzIeAjMyPgI1NCYDAgUD
+ N3eAiEZmY01/prOzTSwaGR4pQVJSShkoXV9YQykKFyMZQImKiH5xLxUOCzNQYjAGJSVNgqlb
+ OFY6HRQKEB86M2KebzsRkQIHJ0MxHF9kVravooViGA4ZFxkyMS4mHAgZUWNvb2ssDx0XDSM9
+ UlxjLxYQF05ZXCUFIGE7Zat8RRwtOh0tGyAbQ2yKSCI2AAAA//8ANf/jBGIGFAImAEYAAAAG
+ AEEQAAAA//8ANf/jBGIGHAImAEYAAAAGAI/WAAAA//8ANf/jBGIFtAImAEYAAAAGAGcKzwAA
+ //8ANf/jBGIFEwImAEYAAAAHAIMAMP+A////uf/uAnYGFAImANsAAAAHAEH+8wAA////7f/u
+ Ai4GHAImANsAAAAHAI/+tQAA////yf/uAjIF5QImANsAAAAHAGf+tQAA////8f/uAiwFkwIm
+ ANsAAAAHAIP+7wAAAAEANf/jBGYGHgBlAYu4AGYvuABnL7gAZhC4ABrQuAAaL7gAZxC4ABDc
+ ugALABoAEBESObgAGhC5ADMABPRBIQAGADMAFgAzACYAMwA2ADMARgAzAFYAMwBmADMAdgAz
+ AIYAMwCWADMApgAzALYAMwDGADMA1gAzAOYAMwD2ADMAEF1BAwAGADMAAXFBBQAVADMAJQAz
+ AAJxuAAQELkAPQAH9EEFABoAPQAqAD0AAnFBIQAJAD0AGQA9ACkAPQA5AD0ASQA9AFkAPQBp
+ AD0AeQA9AIkAPQCZAD0AqQA9ALkAPQDJAD0A2QA9AOkAPQD5AD0AEF1BAwAJAD0AAXG6AFQA
+ GgAQERI5ALgAAC+4AAIvuAAARVi4ABcvG7kAFwAIPlm6AAsAFwACERI5uQA2AAL0QSEABwA2
+ ABcANgAnADYANwA2AEcANgBXADYAZwA2AHcANgCHADYAlwA2AKcANgC3ADYAxwA2ANcANgDn
+ ADYA9wA2ABBdQQMABwA2AAFxQQUAFgA2ACYANgACcboAVAAXAAIREjkwMQE2MzIWFRQGBw4B
+ Bx4DFRQOBCMiJjU0PgQ3PgEzMhYVFA4EBw4DFRQWMzI+BDU0LgInDgEHBiMiJjU0PgI3PgM3
+ LgM1ND4CMzIWFz4DA3sGBQ4SERQoUytRj2w/S36jsbFMhJMvVniSqFshMRQdKhclMTQzFVir
+ h1NMWkOWk4ZmPTphgUhRsWIZDQsLBgwQCwksQVAsYJpsOhYiKRRVymYwW0w5BhsDIhcUKQ4d
+ OiAoaYGZV3zcuZJlNn6GQouLhHViIg0PLyodJBgOCw4LL3uRoVNIRDVhh6O6ZFKKcVojQp5n
+ GhoVECgpJw8NKzY/ISAaDgwRCxALBSclIkE0Jf//AML/yQQ7BdICJgBPAAAABgB0TkgAAP//
+ ADX/4wR7BhQCJgBQAAAABgBBOQAAAP//ADX/4wR7BhwCJgBQAAAABgCPOQAAAP//ADX/4wR7
+ BdICJgBQAAAABgBnYu0AAP//ADX/4wR7BY4CJgBQAAAABgB0bQQAAP//ADX/4wR7BZMCJgBQ
+ AAAABgCDNQAAAAADACMAewQOBGYAJAA1AE0AbboAKAAwAAMrQQUA2gAwAOoAMAACXUEbAAkA
+ MAAZADAAKQAwADkAMABJADAAWQAwAGkAMAB5ADAAiQAwAJkAMACpADAAuQAwAMkAMAANXbgA
+ KBC4ADnQuAAwELgAQdC4AEEvALgAJS+4AD4vMDETMh4CMzI+BDc+AzMyFhUUDgIHDgMjIjU0
+ PgIBMhYVFA4CIyImNTQ2Nz4BEzIWFRQOAiMiJjU0PgI3PgM3PgE7BwwZMS0MMT5HRDkTVoRs
+ XC4XEAkWJx4hisP1i5kCBQkCLxYoKz1CFyIhJjIaPRcWKCk6QxkdLgUNFhEPDw4RDxEfArAG
+ CAYDBAYGBQIJEAwIDwsJFRUUBwkeHRZBCRoZEgG2Ji4iRTgjHSAvUyoWF/0yJi4gRjwnKiAQ
+ JSYjDw0HAgQLDBUAAAAAAwA1/skEewTfADEAQwBZAT24AFovuABbL7gAWhC4AAjQuAAIL7gA
+ WxC4ACLcugADAAgAIhESOboAHQAIACIREjm6ADgACAAiERI5uQA/AAX0QQUAGgA/ACoAPwAC
+ cUEhAAkAPwAZAD8AKQA/ADkAPwBJAD8AWQA/AGkAPwB5AD8AiQA/AJkAPwCpAD8AuQA/AMkA
+ PwDZAD8A6QA/APkAPwAQXUEDAAkAPwABcboASQAIACIREjm4AAgQuQBUAAT0QSEABgBUABYA
+ VAAmAFQANgBUAEYAVABWAFQAZgBUAHYAVACGAFQAlgBUAKYAVAC2AFQAxgBUANYAVADmAFQA
+ 9gBUABBdQQMABgBUAAFxQQUAFQBUACUAVAACcQC4ABUvuAAvL7oAAwAvABUREjm6AB0ALwAV
+ ERI5ugA4AC8AFRESOboASQAvABUREjkwMRc0NjcuAzU0PgQ/AT4DMzIWFRQOAgceAxUUDgQH
+ DgEHDgEjIiYBIgcGAg8BPgU1NC4CAT4DNwcOAwcOAxUUFjM6AfIcGT5bPB0/bZKnslc7ExwZ
+ GhESHg8bIxQ0UjgdQnCToKNJER0LER4dIBMCmRwZOI5dVj6GfnFVMhcnMv2lIFBXWisXFCww
+ MRk7Z0wrQjkIEe4makEBGjhZQFarnYptSg5rIkE0ISAbDy86RCUFKD5RLl6smYFmRxIoTy1E
+ RSEEXAdk/u+6rBlKXWt0eTwnNyEP/PVLpamnTBUSDwoOESppc3c5OUAA//8Acf/dA7IGGAIm
+ AFYAAAAGAEGrBAAA//8Azf/dA7IGNwImAFYAAAAGAI8IGwAA//8Azf/dA7IF5QImAFYAAAAG
+ AGfmAAAA//8Azf/dA7IFkwImAFYAAAAGAIMdAAAA////lP3LA8gGHAImAFoAAAAGAI+bAAAA
+ AAIA0/2yBY8GbwA7AFwBALsANQAEACQABCu7AAUABABFAAQruAAkELkAWwAH9LgAEdC4ABEv
+ uABbELgAFtC4ACQQuAAe0LgAHi+4ACQQuAAh0LgAIS+4ADUQuAAt0LgALS+4ADUQuAAw0LgA
+ MC+4ADUQuAA80LgAPC9BBQAaAEUAKgBFAAJxQSEACQBFABkARQApAEUAOQBFAEkARQBZAEUA
+ aQBFAHkARQCJAEUAmQBFAKkARQC5AEUAyQBFANkARQDpAEUA+QBFABBdQQMACQBFAAFxuAAF
+ ELgAXtwAuAAoL7gAGy+7ADwAAQAOAAQruwAAAAMASgAEK7oAEQAOADwREjm6ADUAGwAoERI5
+ MDEBMh4CFRQOBiMiJiceAxUUDgIjIiY1NDY1NAI1ETQ2MzIeAhUUBhUUHgIXPgUBMj4GNTQu
+ AiMiDgQHDgMVFA4CKwEEoD5aOxw/bZGkraaVOQ4YCwMFBAIKFSEYIxYHDSAdEBUMBAMBAwQC
+ IHORp6eg/Pozipukm4poPBQiLRotbHV5cmcpFxoMAwcXKyQYA7IcM0kuOHd4dGhYQCQBA1Zr
+ SDQfNmhTMkw9NHE3cgFZ3APqZmEoQE4nLUoTGn+x13IjS0Y/Lxv86CA4TVdfX1kmFyIXDBAd
+ Ji0xGA4UEhUOEhwSCgD///+U/csDyAWTAiYAWgAAAAYAg9QAAAAAAQDE/+4BYAO2AB0Ak7sA
+ CgAHABkABCu4ABkQuQAFAAf0QSEABgAKABYACgAmAAoANgAKAEYACgBWAAoAZgAKAHYACgCG
+ AAoAlgAKAKYACgC2AAoAxgAKANYACgDmAAoA9gAKABBdQQMABgAKAAFxQQUAFQAKACUACgAC
+ cbgAChC4AA/QuAAPLwC4AAAvuAAARVi4ABQvG7kAFAAIPlkwMQEyHgIVFA4CFRQeAhUUDgIj
+ Ii4CNTQSPgEBAA0hHhQICwgDAwMFDx0XFRkPBQUNGAO2FSAnEgtdhp1LYXlIIwkMFA4IIj1W
+ M6MBD8NrAAAAAf/o/7IE1gVKAFkAqboAOwAQAAMrQRsABgA7ABYAOwAmADsANgA7AEYAOwBW
+ ADsAZgA7AHYAOwCGADsAlgA7AKYAOwC2ADsAxgA7AA1dQQUA1QA7AOUAOwACXbgAOxC5AAAA
+ B/S4ADsQuQAVAAb0uAAF0LgABS+4ABUQuAAI0LgACC+4ABUQuQAkAAf0uAA7ELgAK9C4ACsv
+ uAA7ELgAQNC4AEAvALgAHS+7AEMAAwBVAAQrMDE3ND4CNz4BNw4DIyImNTQ+Ajc+AzU0NjMy
+ HgIXFhUUBw4DBz4DNzYzMhYVFAYHDgEHDgMHHgEzMj4ENzYzMhUUBw4CBCMiLgKmDxUZCQIE
+ Ahg6OTMSHh4YPWlSAwYEAxkYDBMSEwwcLAIFBAUDKEA4NBwHCA4MEhkZfV4CBQMDAQ8gDjN+
+ jJOOgzYTDRAYPbPd/v+MPEspDlQeLiATAi56SAwdGRAkHBEUHzQxY8aldhJFUxAdKBg2OUpB
+ EkBVZjgZKiQcDAMXEBAoFxdkO0B+c2MkBQMQHSkxOB4KDhIZQXRXNBotOwAAAAAB/6L/jQI5
+ BmoAUQC8uwAdAAcARgAEK7gAHRC4AA/QuAAPL7gAHRC4ACLQuAAiL0EFABoARgAqAEYAAnFB
+ IQAJAEYAGQBGACkARgA5AEYASQBGAFkARgBpAEYAeQBGAIkARgCZAEYAqQBGALkARgDJAEYA
+ 2QBGAOkARgD5AEYAEF1BAwAJAEYAAXG4AEYQuAAs0LgALC+4AEYQuAAz0LgARhC4AE3QuABN
+ LwC4AAAvuAAnL7oADwAnAAAREjm6ADQAJwAAERI5MDETMh4CFRQGFRQeBBc+ATc+ATMyFhUU
+ DgIHHgMVFA4CIyIuAjU0LgQ9AQ4DIyImNTQ+Ajc+Azc8ATY0NjQ1ND4C/BMXDAQBAQMDAwUC
+ P1wvBQcDDgwOMl5RAgUDAhkiIgkJDAYCAQECAQEaQkI9FR0eChclGgsxOz0XAQEBCRIGahYj
+ LRcRIg4JRWuKn6xXKDkVAgIZDg8kNUo1ZbmSXwsdMyYWFB8nEw01R1JSTR9SDiIeFCQbCxAQ
+ EQwFGyEjDU62ua+LXAkSMi4hAAEA+wP7A2QF7AApABUAuAAfL7gAAy+6ABgAAwAfERI5MDEB
+ DgEjIiYnLgMnLgE1ND4CMzIeAhc+Azc2MzIWFRQGBw4DAkwMJhQRHAYPKzAyFhURCxIWCws1
+ QEEYGT9HTCYWEA4NDxEPPEdKBCMUFBAQKUg6LQ8OHQ0MFA8IJ0VhOi9fXVgoFx0VFjMTEUJV
+ YgAAAAABAI0ENwOyBdgAJACKuwALAAQAAAAEK0EhAAYACwAWAAsAJgALADYACwBGAAsAVgAL
+ AGYACwB2AAsAhgALAJYACwCmAAsAtgALAMYACwDWAAsA5gALAPYACwAQXUEDAAYACwABcUEF
+ ABUACwAlAAsAAnG4AAsQuAAI0LgACC8AuAAYL7oABQAgAAMruAAgELkAEAAB9DAxEzQ+AjMy
+ FhUUBhUUHgIzMj4CNz4BMzIVFAYHBgQjIi4CjQwWHhIWDAEXKTYgM2l2iVILEwYLFBeF/u2Z
+ Kkk2IAT6FDItHiUXDBcJIS0bDBtBak8LChAOLRqenhsySQAAAAEBsgS+AosFoAANAHK7AAMA
+ BwAJAAQrQQUAGgAJACoACQACcUEhAAkACQAZAAkAKQAJADkACQBJAAkAWQAJAGkACQB5AAkA
+ iQAJAJkACQCpAAkAuQAJAMkACQDZAAkA6QAJAPkACQAQXUEDAAkACQABcQC7AAAAAwAGAAQr
+ MDEBMhYVFAYjIiY1ND4CAjEtLUU2LjASIi4FoDssOUI3MBcsIxUAAgExA+EDgQWyABgALAD3
+ uAAtL7gALi+4AAjcuQAZAAX0QQUAGgAZACoAGQACcUEhAAkAGQAZABkAKQAZADkAGQBJABkA
+ WQAZAGkAGQB5ABkAiQAZAJkAGQCpABkAuQAZAMkAGQDZABkA6QAZAPkAGQAQXUEDAAkAGQAB
+ cbgABdC4AAUvuAAtELgAEtC4ABIvuQAjAAX0QSEABgAjABYAIwAmACMANgAjAEYAIwBWACMA
+ ZgAjAHYAIwCGACMAlgAjAKYAIwC2ACMAxgAjANYAIwDmACMA9gAjABBdQQMABgAjAAFxQQUA
+ FQAjACUAIwACcQC4AAAvuAAFL7sAJgACAA8ABCswMQEyFz4BMzIWFRQOBCMiJjU0PgQXNC4C
+ Jw4DFRQWMzI+BAKwExQJIBkxNylEWWJjK1NHK0RVVUyLExsbBzJyYEAYICVRTUY0HwWkCgsN
+ OysnVFFINyA/OCpTSj4tGm8OCwUGCQUwRFElFBkYJzI1NAAAAAECgf5OBNAAXgAuAHq7AA4A
+ BAAoAAQrQSEABgAOABYADgAmAA4ANgAOAEYADgBWAA4AZgAOAHYADgCGAA4AlgAOAKYADgC2
+ AA4AxgAOANYADgDmAA4A9gAOABBdQQMABgAOAAFxQQUAFQAOACUADgACcQC4AAAvuAACL7sA
+ EQACACMABCswMSU2MzIWFRQHDgUVFBYzMj4CNzYzMhYVFAYHDgMjIi4CNTQ+BAPTCgkOFhYX
+ ODg1KRkaHSxkZmEqCggICAkLJF5qbzYjPS8bKD9OS0BcAggJDQ8RMDtBQj4bEh0bMkUqCg8L
+ DBsOLU05IA0cKh0tXVhQPigAAAIBLAO2A28GNgAbADcAHAC4ADUvuAANL7gAAEVYuAApLxu5
+ ACkADD5ZMDEBHgEVFA4EBw4BIyImNTQ3PgM3PgEzMiUeARUUDgQHDgEjIiY1NDc+Azc2MzIW
+ AgAQEBQfJyUfCQgXCxESDRcrIxkFAhYPDwFWERYaKDAuJQgHGAsREg0XOTQnBQMSBhAF8hYi
+ HRxQWl9UQhEODRkUFx0zc3VxMhIdGRcyJR9LT09FOBEODRgUFx0zcXNwMh8LAAAAAAIAb/9t
+ BOkFsABLAGAAHwC4AAAvuAAoL7oATAAoAAAREjm6AFkAKAAAERI5MDEBMh4CFRQOAhUUFhce
+ Axc3NjIzMhUUDgIHHgEXHgMVFAYjIi4CJw4FIyIuAjU0PgI3PgU3PgUBPgM3Jy4FJw4FBwL2
+ ByAhGhETERkOFzg/RCNlBQgDEBQgJhIRIhELGxcQHhcoNionGS15ipKMfS8bMCMVBgsRCwct
+ QEtKQRYKJjA0MSn+EFats7pjNREoKCgkHgosTkhFRUopBbAEDRkVCRwmLBkxdTVb1+DcXh8C
+ CwgVFxkKKEgdFRwVDwgPEw4tVkgTKSYiGQ8aKjUcFSUoLRsSY4ecmIQrFFpweGJA+m0IGiEn
+ F6Q1hJGXkoY2X6ulpLHEcgAB//r/vATrBPIAewEfuAB8L7gAfS+4AGncuQAaAAT0QQUAGgAa
+ ACoAGgACcUEhAAkAGgAZABoAKQAaADkAGgBJABoAWQAaAGkAGgB5ABoAiQAaAJkAGgCpABoA
+ uQAaAMkAGgDZABoA6QAaAPkAGgAQXUEDAAkAGgABcbgAfBC4AF3QuABdL7kAJgAE9EEhAAYA
+ JgAWACYAJgAmADYAJgBGACYAVgAmAGYAJgB2ACYAhgAmAJYAJgCmACYAtgAmAMYAJgDWACYA
+ 5gAmAPYAJgAQXUEDAAYAJgABcUEFABUAJgAlACYAAnG4AF0QuABG0LgARi+6AFMARgBpERI5
+ ALgAPC+7AHcAAwALAAQruwBkAAMAHwAEK7sAKQABAFgABCu6AFMAWAApERI5MDElMhYVFAYH
+ DgMjIiY1JjU0PgI3PgM1NC4CIyIOBBUUFjMyNjc+ATMyHgIVFAYHDgMjIi4ENTQ2MzIeAjM6
+ ATc+AzUOAyMiLgI1ND4EMzIeAhUUDgIHDgEVFBYXHgEzMj4CBMUUEhMTNldKQSBpbhgQGyMS
+ OmBDJSk9RRxDlZCEZDtCOSVTIgsWDRAXDgYXDRUvNz8jDjhDSDomFyETN0BEHwkSCCIwHQ0O
+ LTIyEzZQNRpFd56zvVs8aU0tPWWBRAMCCAYJOTkhWFdK3RUODx8JGh0NApKbFxcOHR4eDzFm
+ aGgzRE8oCjZdfIyVRzlACxAXGxUfJRAsYi1HWzQUBg4UHCQWGhwJCgkCBTpKSBQJDwsGJDxO
+ KW7IrYxkNiBEbEtIo52JLhEgDhwvFiIaCg0KAAAAAAH/+P+kBBkDjwBtASS7ACYABAAuAAQr
+ ugALAB8AAyu4AAsQuAAI0LgACC9BBQDaAB8A6gAfAAJdQRsACQAfABkAHwApAB8AOQAfAEkA
+ HwBZAB8AaQAfAHkAHwCJAB8AmQAfAKkAHwC5AB8AyQAfAA1dugAXAB8ACxESObgAHxC4ABrQ
+ uAAaL0EhAAYAJgAWACYAJgAmADYAJgBGACYAVgAmAGYAJgB2ACYAhgAmAJYAJgCmACYAtgAm
+ AMYAJgDWACYA5gAmAPYAJgAQXUEDAAYAJgABcUEFABUAJgAlACYAAnG6ADwALgAmERI5ALgA
+ Uy+4AAMvuAApL7sASgABAD8ABCu6ABcAPwBKERI5uAA/ELgAPNC4ADwvuABKELgAR9C4AEcv
+ ugBdAD8AShESOTAxBRQGIyIuAjU0NjU0LgQnJjQ1NDcOAQcUDgIVFA4EFRQGIyIuAjU0PgI3
+ PgQ0NTQ3DgEjIi4CNTQ2MzIWMzI+BjMyHgIVFA4CBx4BFx4DFxQeBgNtJiQRFQwEAQMGBwcG
+ AgIGSKRLAwMDBAYGBgQqJgkNCAMDBQYDAwUDAgEGMlEXMz4gChAZGUUrC0hpgYaBa0sMGScb
+ DhY2XEYFCQICBAQEAwQEBgYGBAMmHRk8W2ouDBYLHUxTVUs+EgoUCykjChEIEz5FRRkSWXJ/
+ blEMIh0TIi0aHDw7NhcdTFRUTD0SIiYFBhUbHAgQDwgFCAsLCwgFCxETCA0LBgYJCRULEj9G
+ RxoENFFkZ2JMLgAAAAH+K/6aAmIFdQAiAAsAuAAAL7gAES8wMQEyFRQGBw4FBw4DIyImNTQ2
+ Nz4FNz4DAjsnKyMhboqcn5pBLSwaFRULEig0NYuaoZeFMRYcFhUFdU4YWEA8mrfR4/J9VnNG
+ HignM59qbNrX0MW5UyU3JBIAAAAAAQA1/+MEZgWkAEIBV7gAQy+4AEQvuAAP3LgAQxC4ABnQ
+ uAAZL7kAMgAE9EEhAAYAMgAWADIAJgAyADYAMgBGADIAVgAyAGYAMgB2ADIAhgAyAJYAMgCm
+ ADIAtgAyAMYAMgDWADIA5gAyAPYAMgAQXUEDAAYAMgABcUEFABUAMgAlADIAAnG4AA8QuQA8
+ AAf0QQUAGgA8ACoAPAACcUEhAAkAPAAZADwAKQA8ADkAPABJADwAWQA8AGkAPAB5ADwAiQA8
+ AJkAPACpADwAuQA8AMkAPADZADwA6QA8APkAPAAQXUEDAAkAPAABcQC4AAgvuAAARVi4ABYv
+ G7kAFgAIPlm5ADUAAvRBIQAHADUAFwA1ACcANQA3ADUARwA1AFcANQBnADUAdwA1AIcANQCX
+ ADUApwA1ALcANQDHADUA1wA1AOcANQD3ADUAEF1BAwAHADUAAXFBBQAWADUAJgA1AAJxMDEB
+ LgE1ND4CMzIeBBUUDgQjIiY1ND4ENz4BMzIWFRQOBAcOAxUUFjMyPgQ1NC4EAQxZTxYiKRRU
+ yMq9klhLfqOxsUyEky9WeJKoWyExFB0qFyUxNDMVWKuHU0xaQ5aThmY9R3WYo6IFTgoNFAsQ
+ CwUlSWyPsWl83LmSZTZ+hkKLi4R1YiINDy8qHSQYDgsOCy97kaFTSEQ1YYejumRbl3lbQSgA
+ AAH//v7uBi0FYABnAP+4AGgvuABpL7gAaBC4AA3QuAANL7kAAwAH9EEhAAYAAwAWAAMAJgAD
+ ADYAAwBGAAMAVgADAGYAAwB2AAMAhgADAJYAAwCmAAMAtgADAMYAAwDWAAMA5gADAPYAAwAQ
+ XUEDAAYAAwABcUEFABUAAwAlAAMAAnG6ABsADQADERI5uABpELgAQty4ADvQuAA7L7gAQhC4
+ AD7QuAA+L7gAQhC5AFMABPS4AEzQuABML7gAUxC4AFjQuABYL7gAUxC4AFvQuABbLwC4ADAv
+ uAAIL7gAAEVYuAAALxu5AAAACD5ZuwAmAAMAHgAEK7oAGwAeACYREjm6AFsACAAwERI5MDEF
+ MhYVFA4CIyIuAjU0PgQ3PgU3DgEjIi4CNTQ2MzI+BDc+ATMyFhUUDgIHDgEHBhQVFBYVERQO
+ AiMiJjU0Nz4FNTQmNCY1NDY3DgEHDgEHDgUCYBQPFyIpEwsPCgUCAgQDBAIECw0ODQoEab1I
+ LUs4HyAdRL7a7ObUVWpzFxcQK1N2SxEiEwEFCRIdFDQyLwIDAwIBAQEBBgZZyGYGFAsJDwsH
+ BQMXGBQbR0AtGSQpEAtScYR4YBYtaWpoWUQTGh8ZIiYMGBUXKDQ4OxogIw0RCiEsMxwHDgYG
+ DwgiZDr9KRwxJRUYERkSCDBCTU1EGDJ8eGgeJlomIEIdJWdBN4GMko+HAAEAef/nBZUE+ABd
+ AIMAuAAARVi4ADMvG7kAMwAIPlm7AAAAAQAJAAQruAAzELkAIAAB9EEhAAcAIAAXACAAJwAg
+ ADcAIABHACAAVwAgAGcAIAB3ACAAhwAgAJcAIACnACAAtwAgAMcAIADXACAA5wAgAPcAIAAQ
+ XUEDAAcAIAABcUEFABYAIAAmACAAAnEwMQEyHgIVFAYrASIOAgceARceAxUUDgIHDgMHMj4E
+ NzYzMhYVFAcGDAIjIi4CNTQ3PgM3NC4EJw4BIyIuAjU0NjcmNTQ2MzIWFz4DA04wYk8zHBGb
+ LXmFiT40flIKHhsTDhUYCyludGwoULfCxr+yTQ0KCwkQcf7x/tn+x5sdMiQVEUiIfGoqHjRE
+ TVAlGSgLGiITBxYTDigbER8QNJehlwT4DRcgEhMKCxIWCjWQag0nJyIJCBgaGgoob36FPRMi
+ MTxGJwYMCBILU4JYLg8bIhQZF2GggmYnCDJGVllXJAMDBg4WDxQdCxELDgsICAkSDwkAAAAB
+ AGoCLQSPAwQAJAARALgAES+7AAUAAQAeAAQrMDETMh4CMzI+Ajc+BTMyFhUUBgcOBSMiNTQ+
+ An0FCRMlIg1DT0oVK3aChnVbFxELHS4RZ5Kytq1GdQIECAK8BggGBgkJAwYPDg4KBhALEysP
+ BhUYGhUNQggaGRIAAAAAAQAb/2IFRgW8AFAAHwC4AEAvuAAmL7sADAABAAAABCu6ABgAQAAm
+ ERI5MDETIjU0PgIzMh4CMzI+AjMyHgQXPgU3PgUzMh4CFRQOBgcOBRUUDgIjIi4CJy4FJw4D
+ j3QCBAcFBQkTJiINQVFWIR45NjErIw0DHCgvLigNGUNKS0ExCwwWDwkVJDA0NjAoDRMtMC0j
+ FQkVJhwdHhENCwcgKS4vKg8YRUhEAodCCBsZEgcHBwoLCk17mJeFKhZVandvXx05oKyrhlQU
+ Ii4ZDUFbcHZ4bFoeLGhvbmRVHDZDJQ4dMkMlGGmDkIFiFAQKCQYAAwA1AOwFdQP8ACUANwBJ
+ AY24AEovuABLL7gAShC4AA3QuAANL7gASxC4ACHcugAFAA0AIRESOboAGQANACEREjm5ADUA
+ BPRBBQAaADUAKgA1AAJxQSEACQA1ABkANQApADUAOQA1AEkANQBZADUAaQA1AHkANQCJADUA
+ mQA1AKkANQC5ADUAyQA1ANkANQDpADUA+QA1ABBdQQMACQA1AAFxuAANELkAQgAE9EEhAAYA
+ QgAWAEIAJgBCADYAQgBGAEIAVgBCAGYAQgB2AEIAhgBCAJYAQgCmAEIAtgBCAMYAQgDWAEIA
+ 5gBCAPYAQgAQXUEDAAYAQgABcUEFABUAQgAlAEIAAnEAuAAARVi4ABwvG7kAHAAMPlm7AEUA
+ AgAKAAQruwAwAAEAAAAEK7sAFAADADsABCu4ABwQuQAmAAH0QQUAGQAmACkAJgACcUEhAAgA
+ JgAYACYAKAAmADgAJgBIACYAWAAmAGgAJgB4ACYAiAAmAJgAJgCoACYAuAAmAMgAJgDYACYA
+ 6AAmAPgAJgAQXUEDAAgAJgABcTAxASIuAicOAyMiJjU0PgQzMh4CFz4BMzIeAhUUDgITIg4C
+ Bx4DMzI+AjU0JgUuASMiDgQVFBYzMj4CA+M8aVE3DC5hb4BNU1cqR11pbDIkQjcoClq9Zjho
+ TzBLdY8VIktRVy4PMz5FIDdoUjJq/esPPScvWU9DLxspIzNbXGQBZCtCTiNEfF44bWE/fnJh
+ RykVIy4ZZVwkRmpFTotpPQItFzRVPTJONh0pSWI5TVbEPDInQlRbWSYtJTNhjQAAAAH/K/3F
+ AskGeQBFAP24AEYvuABHL7gARhC4ACPQuAAjL7kAAAAE9EEhAAYAAAAWAAAAJgAAADYAAABG
+ AAAAVgAAAGYAAAB2AAAAhgAAAJYAAACmAAAAtgAAAMYAAADWAAAA5gAAAPYAAAAQXUEDAAYA
+ AAABcUEFABUAAAAlAAAAAnG4AEcQuAAv3LkAPAAG9EEFABoAPAAqADwAAnFBIQAJADwAGQA8
+ ACkAPAA5ADwASQA8AFkAPABpADwAeQA8AIkAPACZADwAqQA8ALkAPADJADwA2QA8AOkAPAD5
+ ADwAEF1BAwAJADwAAXEAuwAcAAMACgAEK7sAKgACAD8ABCu4ACoQuAA03DAxJRQOAgcOAyMi
+ JicuAzU0PgIzMh4CMzI+BDUQGgE+AjMyHgIVFA4CIyImNTQ3PgE1NCYjIg4CCgEBSgQIDAcI
+ FyMxIkN3RCErGAkHDhcPD0lXVx0TGhIJBQEdMUJKTyUiOy0aChckGhAYBAgLDxMcODUuIhS8
+ QI6SjT4+Ty4RGxYKFRQUCQkgIBcUGBQ5XHZ4cSoBOQHWAVPdgjQhMDgXGEQ/LBUTCwsXQR4g
+ LD+J1/7R/nIAAAACAD4BcASiBLcAKQBXADcAuAAQL7gARS+4AFMvuwAvAAMASwAEK7sABQAD
+ AB0ABCu7AAsAAwAYAAQruABFELkANQAD9DAxEz4DMzIWFx4BMz4BNzYzMhUUBgcOASMiJy4B
+ IyIOAgcOASMiNTQ2Ez4DMzIWFx4BMzI+Ajc+ATMyFRQGBw4BIyImJy4BIyIOAgcOASMiNTQ2
+ Xi5gYF4sMVcjEjEeP7RzMRkQHyF70lFZNiY9IBYyP08yFSkPHw8bKlZXWCwzYjMbOh4fQ0dL
+ JxgmCxEfIWGrTStNIy9PJho1OD4iFyoRIhMDH0Z0VC5ARiYiAYdyMBUSQSqbmFpAQB48Wj0a
+ GCQOKv7aMVc/JTY/Ih4cMkUoGRcWE0Apd30oKjkxFik5IxcVIA4oAAABAFH/gwSiBXsAdgAz
+ ALgAJC+4AF4vugAIACQAXhESOboAKwAkAF4REjm6AEAAJABeERI5ugBlACQAXhESOTAxASIO
+ AgcOAQc+AT8BPgEzMhYVFA4CBw4DBw4BBw4DIyImNTQ2PwEOAyMiLgI1NDY3PgM3PgE3DgUj
+ Ii4CNTQ+AjMyPgI3PgE3PgMzMhUUDgIHNjMyHgIVFA4CIyImNTQmBE0SOERNKDuCR1GTNJYG
+ DQYKEStFVyweTVheLxg0Gi0sGxUVCxEnNSETHx0dERUqIRQeKQ0zRFMtPHs+GUpTVks6Dhcb
+ DQMBCBEPEm+culwwWyoVHBcVDycaLTwjQzYlMBwKDA8PAwYPCAOgCQ4SCE6ybQwaDysCAgsO
+ EisqJgwIExMTCStdMlVzRx4oJjGiakIDBQMBBhEdFxMbDAQHCQsGYKdPBhASEQ4JDBQWCwsS
+ DQcdJykMP4NIJTckEk4QQFVjMQYJEhkQEBcPBwcPCwYAAAACACb/rgSRBU4ANABWADMAuAAA
+ L7sAOgADAE8ABCu7ABQAAQAeAAQruAAUELgAF9C4ABcvuAA6ELgANdC4ADUvMDEBMhYVFA4C
+ Bw4DBx4FMzI2MzIVFA4CIyIuBCcuATU0Njc+Azc+AwEyHgIzMj4CNz4BMzIWFRQGBw4FIyIu
+ AjU0NgR5Cw0OFx4RieLKv2YOXoqps7BMER0LDyErLAtipZKGho1RIhgjH27j5+ZxGyMYEfvo
+ CSEoKBFf1ODlcAUKBBIPFA40kaavpJAzJ0MxHBkFTg8QCxsdHAteinNnOg1DVVtMMQYMESUf
+ FCE5TFddLRMpGB8jFEZ9e31FEBgQCPrnAQIBDhYdDwEBDgoOHQcZKR8WDgYVHyUQDhAAAAAC
+ ACP/ugSBBR8ANgBYAC8AuwA8AAMAUQAEK7sAJwABAB0ABCu4AB0QuAAg0LgAIC+4ADwQuAA3
+ 0LgANy8wMTcOASMiLgI1ND4CMzIXPgM3LgcjIgYjIjU0PgIzMh4CFx4BFRQGBw4DBzIeAjMy
+ PgI3PgEzMhYVFAYHDgUjIi4CNTQ2sggmFg4bFQ0XIiYOFQNg1djRXQo/XHF6fHFeHxEdCw4W
+ JzUfQqvI4noiFxwdaNnl79UJISgoEV/U4OVwBQoEEg8UDjSRpq+kkDMnQzEcGewDBgQJDwsP
+ IhwTFBllgZRKCis5QkI+LxwHDRgnHQ9EbohDEygZHjgXUpWAadABAgEOFh0PAQEOCg4dBxkp
+ HxYOBhUfJRAOEAAAAAIAYP+wAwwGGQBAAGABVrsAUgAHAAMABCu7ACAABwBDAAQruwArAAcA
+ NQAEK0EFABoANQAqADUAAnFBIQAJADUAGQA1ACkANQA5ADUASQA1AFkANQBpADUAeQA1AIkA
+ NQCZADUAqQA1ALkANQDJADUA2QA1AOkANQD5ADUAEF1BAwAJADUAAXFBBQAaAEMAKgBDAAJx
+ QSEACQBDABkAQwApAEMAOQBDAEkAQwBZAEMAaQBDAHkAQwCJAEMAmQBDAKkAQwC5AEMAyQBD
+ ANkAQwDpAEMA+QBDABBdQQMACQBDAAFxugBNADUAKxESOUEhAAYAUgAWAFIAJgBSADYAUgBG
+ AFIAVgBSAGYAUgB2AFIAhgBSAJYAUgCmAFIAtgBSAMYAUgDWAFIA5gBSAPYAUgAQXUEDAAYA
+ UgABcUEFABUAUgAlAFIAAnG4ACAQuABi3AC4AA8vuAAwL7oATQAwAA8REjkwMRMuATU0PgQ1
+ ND4CMzIeAhceBRceAxUUBgcOAQcOAxUUDgIjIi4CNTQuAicuBSU2NTQuAicuAycOAxUUHgQX
+ HgEzMj4Cew0OIzU+NSMJFSUdHB4SDAwHHSMnIx4ICxgTDQkLHjMiCx4cExwmJwoKCwYBCA4U
+ DAgiLDIwKAHtEw4XHA4RGBkeFjlUNhsXJS4uKA0OEwgJHicwAnMaQiMiYHB5d20sNkMlDh0y
+ QyUZUGBlWkUQFioqKxgTKRU7jVccTE5JGRo4Lx8QHSYWFSgoLRoRPk1WVUsqNSMZLC85Ji0/
+ RFtJZrmWahgSPUpQSj4SFBI5YIAAAP//ABf/vASkBnkAJgBHAAAABwBKAyUAAP//ABf/jQR7
+ BnkAJgBHAAAABwBNAyUAAAABAV7+DAKD/8sAJAB2uwADAAUAFgAEK0EFABoAFgAqABYAAnFB
+ IQAJABYAGQAWACkAFgA5ABYASQAWAFkAFgBpABYAeQAWAIkAFgCZABYAqQAWALkAFgDJABYA
+ 2QAWAOkAFgD5ABYAEF1BAwAJABYAAXEAuAAKL7sAAAABAB4ABCswMQUyFhUUDgQjIjU0PgI3
+ PgM1NCYjIg4CIyI1ND4CAh8tNx0wOzs3EhkGER4ZGSkeEQ0OCQ0MDQoTDRkoNUc2KE9HPi0Z
+ FQUOFBwVFTI2NhgOFAUGBRcJIB4XAAAA//8AI/9tBUIGhQImACIAAAAHAIoApgGB//8ANf+y
+ BKQFGAImAEIAAAAHAIoBDwAU//8AI/9tBUIHEQImACIAAAAHAN8AagE5//8ANf+yBLsF2AIm
+ AEIAAAAHAN8BCQAAAAIAI/4xBUIFsACJAJgAsbsAMwAEAE0ABCu4ADMQuAAF0LgABS9BBQAa
+ AE0AKgBNAAJxQSEACQBNABkATQApAE0AOQBNAEkATQBZAE0AaQBNAHkATQCJAE0AmQBNAKkA
+ TQC5AE0AyQBNANkATQDpAE0A+QBNABBdQQMACQBNAAFxALgAAC+4AABFWLgAKy8buQArAAg+
+ WbsANgACAEgABCu6AHEAKwAAERI5ugCPACsAABESOboAlAArAAAREjkwMQEyHgIVFA4CFRQW
+ Fx4BFz4DNzYzMhUUDgIHHgMXHgMVFAYjIiYnDgMVFBYzMj4CNzYzMhYVFAYHDgMjIi4CNTQ+
+ BDcuAycOAwcOAQcOAyMiLgI1NDY3PgE3DgEjIi4CNTQ+Ajc+Azc+BRMuAycOAwc+AwL2ByAh
+ GhETERkOFzkgOVtTUS8JBhJBaIJAFiMhJRkMGxcPHhcXLhMjTUEqGh0sZGZhKgoICAgJCyRe
+ am82Iz0vGx0vPEA/GhEhIygZOGt2ilYZMiIOEA0MCgsdGhIXFgUZExYeChgnHRAQMl5NH0M/
+ OBMKJjA0MSlgFCcjHgsfTE5HGStwdGsFsAQNGRUJHCYsGTJzNl3acw4YFhcNAw0LLjc3E09w
+ WE0sFBwVEAcPFAcJHVBWViQSHRsyRSoKDwsMGw4tTTkgDRwqHSVOTEc9MhAbUGuHUhIdHBwQ
+ PI1eJjYkERspMBUpSzYMOCkCAhMcIA0UDgYGDUCJgW8mFFpweGJA/JJJl5GGOEKrsKU9BxQW
+ FgAAAgA1/k4FCQQEAFsAdAGnuwBsAAQAUwAEK7sAIwAEAD0ABCu7ABIABABcAAQrQQUAGgBc
+ ACoAXAACcUEhAAkAXAAZAFwAKQBcADkAXABJAFwAWQBcAGkAXAB5AFwAiQBcAJkAXACpAFwA
+ uQBcAMkAXADZAFwA6QBcAPkAXAAQXUEDAAkAXAABcbgAXBC5AAwAB/S6AAYAXAAMERI5QQUA
+ GgA9ACoAPQACcUEhAAkAPQAZAD0AKQA9ADkAPQBJAD0AWQA9AGkAPQB5AD0AiQA9AJkAPQCp
+ AD0AuQA9AMkAPQDZAD0A6QA9APkAPQAQXUEDAAkAPQABcbgAXBC4AEnQugBfAFwAEhESOUEh
+ AAYAbAAWAGwAJgBsADYAbABGAGwAVgBsAGYAbAB2AGwAhgBsAJYAbACmAGwAtgBsAMYAbADW
+ AGwA5gBsAPYAbAAQXUEDAAYAbAABcUEFABUAbAAlAGwAAnG4ABIQuAB23AC4AAAvuAAARVi4
+ ABwvG7kAHAAIPlm7ACYAAgA4AAQruwBuAAIATgAEK7oABgAcAAAREjm6AEkAHAAAERI5ugBf
+ ABwAABESOTAxATIWFRQGBzYyMzIWFRQGBwYUFRQeAhcWFRQGIyInDgMVFBYzMj4CNzYzMhYV
+ FAYHDgMjIi4CNTQ+BDcuAycOAyMiLgI1ND4GAz4BNy4BIyIGBw4FFRQzMj4EA/QoJgMCBw4I
+ JSU8NQEHDhQNCBsaEREjUkYvGh0sZGZhKgoICAgJCyReam82Iz0vGyU7SUlBFQ0XEw4DUcTM
+ yFUjMiIQOmOGl6KcjwIDHSIGDAYMGA5PsKycd0YnH2aAkJCIBAQdJgoPBgIgGjSDSwcOCCZz
+ f3wuHhkjLyIcUVtcJRIdGzJFKgoPCwwbDi1NOSANHCodK1lVTj4sCSRdZmkxV6J9TBgqNyA5
+ ho2Pg3JUMP5gVZAsAQEDBRlmgpSOfSslID1WbH8AAAD//wA5/88FfAbnAiYAJAAAAAcAjwBM
+ AMv//wA1/+MEQgYcAiYARAAAAAYAj8oAAAD//wA5/88FfAaoAiYAJAAAAAcAZwBCAMP//wA1
+ /+MEQgXlAiYARAAAAAYAZ8oAAAD//wA5/88FfAYzAiYAJAAAAAcA4ACBAJP//wA1/+MEQgVf
+ AiYARAAAAAYA4AK/AAD//wA5/88FfAbJAiYAJAAAAAcA3gB/AN3//wA1/+MEQgXsAiYARAAA
+ AAYA3gIAAAD//wCH/7IFmgclAiYAJQAAAAcA3gDLATn//wA1/4EGrgZIACYARQAAAAcAbgT2
+ AAD//wAf/7IFmgVcAgYAqwAAAAIANf+BBcYGSABgAHkBnrsAdwAHAEwABCu7AC4ABQBWAAQr
+ uABWELgACtC4AAovuABWELgADdC4AA0vuABWELgAENC4ABAvuABWELkAKQAG9LgAGNC4ABgv
+ uAApELgAG9C4ABsvuAApELgAMdC4ADEvuAApELgAM9C4ADMvuABWELgAQNC4AEAvuABWELgA
+ aNC4AGgvuABWELgAa9C4AGsvQSEABgB3ABYAdwAmAHcANgB3AEYAdwBWAHcAZgB3AHYAdwCG
+ AHcAlgB3AKYAdwC2AHcAxgB3ANYAdwDmAHcA9gB3ABBdQQMABgB3AAFxQQUAFQB3ACUAdwAC
+ cbgALhC4AHvcALgAEy+4ADgvuAAARVi4AEcvG7kARwAIPlm7AAUAAQBaAAQruwBTAAEAbgAE
+ K7oAQAA4ABMREjm6AFYAbgBTERI5uABHELkAYQAB9EEhAAcAYQAXAGEAJwBhADcAYQBHAGEA
+ VwBhAGcAYQB3AGEAhwBhAJcAYQCnAGEAtwBhAMcAYQDXAGEA5wBhAPcAYQAQXUEDAAcAYQAB
+ cUEFABYAYQAmAGEAAnEwMQEyHgIzMj4CNz4BNTQmNTQ2MzIeAhUUBgc+AzMyFhUUBgcOAQcO
+ AxUUEhcWFRQOAiMiLgI1NDY3DgUjIi4CNTQ+BDMyFhc3DgEjIjU0PgIBMj4ENz4BNy4BIyIO
+ BhUUFgLlBQkTJSIMPklJGAIBBA8VDxsVDQMCKkU9NxwRCx4uGm1OAwYEAwwPAxMdIQ4REQkB
+ AQIdXXaJkpRGUWo+GF2VuruoOUdZGgc4fEN1AgQI/mw5fIKCfnY0AgMDFUIwKWx4fndpTi47
+ BNkGCAYFCAgDRGgfJzMTIBMdNUwvFUkwBgwJBRALEysQCR8QP46Xnk+M/v9nEhAhMSERHDtb
+ PyuBTBlMVlZFKyI7UC1QqJ6MaT0WEfcICUIIGhkS+30gN0hPUSVOmVcLFCQ/U11kXlUgOD8A
+ AAD//wDT/+cF7wY9AiYAJgAAAAcAigDNATn//wA1/+MEYgUEAiYARgAAAAcAigDGAAD//wDT
+ /+cF7wcRAiYAJgAAAAcA3wC0ATn//wA1/+MEdwXYAiYARgAAAAcA3wDFAAD//wDT/+cF7wZv
+ AiYAJgAAAAcA4ADBAM///wA1/+MEYgWgAiYARgAAAAYA4A4AAAAAAgDT/t0F7wVIAIYAtgGX
+ uwAcAAcAdgAEK7sAOAAEAFIABCu4ABwQuAAQ0LgAEC+4ABwQuAAV0LgAFS9BBQAaAFIAKgBS
+ AAJxQSEACQBSABkAUgApAFIAOQBSAEkAUgBZAFIAaQBSAHkAUgCJAFIAmQBSAKkAUgC5AFIA
+ yQBSANkAUgDpAFIA+QBSABBdQQMACQBSAAFxuAB2ELgAXdC4AF0vuAAcELkAaQAG9LgAYtC4
+ AGIvuAB2ELgAbtC4AG4vuAB2ELgAcdC4AHEvuAB2ELgAc9C4AHMvALgAeS+4AABFWLgAQC8b
+ uQBAAAg+WbgAAEVYuABCLxu5AEIACD5ZuAAARVi4AEUvG7kARQAIPlm4AABFWLgAWi8buQBa
+ AAg+WbsAOwACAE0ABCu7AAAAAQAJAAQruABaELkAIAAB9EEhAAcAIAAXACAAJwAgADcAIABH
+ ACAAVwAgAGcAIAB3ACAAhwAgAJcAIACnACAAtwAgAMcAIADXACAA5wAgAPcAIAAQXUEDAAcA
+ IAABcUEFABYAIAAmACAAAnG6AFcARQB5ERI5MDEBMh4CFRQGKwEiDgQHHgMVFAYUBhQGHQEU
+ FjMyLAI3NjMyFhUUBw4BBwYHDgUVFBYzMj4CNzYzMhYVFAYHDgMjIi4CNTQ+AjcGBCMiJjU0
+ PgI1ND4ENTQuAicuATU0Ny4BNTQ2MzIeAhceARc3PgMBIg4EBw4FIyIuAjU0PgIzMj4CNz4B
+ MzIeAhUUDgIjIiY1NCYDqDBiTzMcEZspbnqAd2klAwQDAgECARwgeAETARcBDXQNCQsJEDBm
+ NwEEFzg4NSkZGh0sZGZhKgoICAgJCyReam82Iz0vGxorOB6r/pK4S0IICQgBAQIBAQIDBQMM
+ ChACAxAKBhUWFAUDBQIcNJmkmgGvDT5QWlRFExNIWGBWQg8XGw0DAQgRDw9Ob4lLkNNLJTAc
+ CgwPDwMGDwgE+A0XIBITCgoQFBMQBSBAOzMTDkxib2ROEcokFClJYzoGDAgSCyM/HAICEDE7
+ QUI+GxIdGzJFKgoPCwwbDi1NOSANHCodJElIRB4+P0FCECktLhYPOkpVUUkaH1locDUGGBEX
+ EBM3ETUtEhshDgoYDgcJEw8K/nsLEBQTEAQEEBMUEQoMFBYLCxINBxQdIg4cFwkSGRAQFw8H
+ Bw8LBgACADX+ogRiA74AWABpAfi7ABEABwBSAAQruwArAAQARQAEK7sABQAFAGAABCu6AA8A
+ UgAFERI5QSEABgARABYAEQAmABEANgARAEYAEQBWABEAZgARAHYAEQCGABEAlgARAKYAEQC2
+ ABEAxgARANYAEQDmABEA9gARABBdQQMABgARAAFxQQUAFQARACUAEQACcUEhAAYAKwAWACsA
+ JgArADYAKwBGACsAVgArAGYAKwB2ACsAhgArAJYAKwCmACsAtgArAMYAKwDWACsA5gArAPYA
+ KwAQXUEDAAYAKwABcUEFABUAKwAlACsAAnG4AAUQuAA40LgAOC+6AEoAUgAFERI5ugBZAFIA
+ BRESOUEFABoAYAAqAGAAAnFBIQAJAGAAGQBgACkAYAA5AGAASQBgAFkAYABpAGAAeQBgAIkA
+ YACZAGAAqQBgALkAYADJAGAA2QBgAOkAYAD5AGAAEF1BAwAJAGAAAXG4AAUQuABr3AC4AABF
+ WLgATS8buQBNAAg+WbsALgACAEAABCu7AAAAAgBjAAQruABNELkAFgAD9EEhAAcAFgAXABYA
+ JwAWADcAFgBHABYAVwAWAGcAFgB3ABYAhwAWAJcAFgCnABYAtwAWAMcAFgDXABYA5wAWAPcA
+ FgAQXUEDAAcAFgABcUEFABYAFgAmABYAAnG6AEoATQAWERI5MDEBMh4CFRQOBCMiJicGFRQe
+ AjMyPgI3NjMyFRQOAgcOBRUUFjMyPgI3NjMyFhUUBgcOAyMiLgI1ND4CNw4BIyIuAjU0PgQB
+ PgU1NCYjIg4EA3k0Si4WWI6wsZ41HScGHxc0VT5Ztq2fQhkMCjBMYTEXNzg1KhkaHSxkZmEq
+ CggICAkLJF5qbzYjPS8bEyArGC5cLz6BaEJUibG6tP3LWrOjjGc6KSMsb3p+dWUDvhUlMh0x
+ amRZQyckF0ZBIz8vGzBQajsWDRlFT1IlETE7QUE+GxIdGzJFKgoPCwwbDi1NOSANHCodHj4+
+ PBsPER5DbU9dsJyCXzT+MBM2PUE8NRMRHhowRFRiAAD//wDT/+cF7wclAiYAJgAAAAcA3gDB
+ ATn//wA1/+MEYgXsAiYARgAAAAYA3g4AAAD//wA5/iUFKQceAiYAKAAAAAcAZwCaATn//wAl
+ /VQDogXlAiYASAAAAAYAZ9AAAAD//wA5/iUFKQcRAiYAKAAAAAcA3wDJATn//wAl/VQEIAXY
+ AiYASAAAAAYA324AAAD//wA5/iUFKQZKAiYAKAAAAAcA4ADVAKr//wAl/VQDogWgAiYASAAA
+ AAYA4AgAAAD//wA5/gwFKQU3AiYAKAAAAAcA9gFOAAD//wAl/VQDogX8AiYASAAAAAcAbQC+
+ ADf//wBU/u4FXgceAiYAKQAAAAcAZwEQATn//wDE/6MD/AY/AiYASQAAAAYAZ39aAAAAAgA6
+ /u4FXgV/AJUAogEwugBjAIYAAyu7ADsABAAcAAQruAA7ELgALtC4AC4vuAA7ELgAMNC4ADAv
+ uAA7ELgASdC4ABwQuABb0LgAHBC4AF7QuABeL0EbAAYAYwAWAGMAJgBjADYAYwBGAGMAVgBj
+ AGYAYwB2AGMAhgBjAJYAYwCmAGMAtgBjAMYAYwANXUEFANUAYwDlAGMAAl24AGMQuABr0LgA
+ ay+4AGMQuQB8AAf0uAB/0LgAfy+4ABwQuACW0LgAli+4AGMQuACd0LgAnS+4ADsQuACk3AC4
+ AHAvuAAARVi4ACQvG7kAJAAOPlm7ABUAAQCOAAQruAAVELgAANC4AAAvuAAVELgABdC4AAUv
+ uAAVELgACNC4AAgvugB/AHAAJBESObgAjhC4AJrQuACaL7oAnQBwACQREjkwMRMyHgIzOgE3
+ PgMzMh4CFRQGBz4FNz4DNz4BMzIeAhUUBgcGFRQXPgEzMhYVFA4CBxU+AzMyFhUUDgIHERQO
+ AiMiJjU0Nz4FNTQmNQ4DBw4DBzIWFRQOAiMiLgI1ND4ENz4BNwcOASMiJjU0PgI3PgE3IyI1
+ ND4CBTUGBAcOAQc+AzdXCQ4fPDcIHRMIDg4NCAcbGxMJB0x5Yk9GQSMBBwkLBxc1DgYNCwcY
+ FQMDJkklGhMPKks7M0UtGQgvITBOZDQJEh0UNDIvAgMDAgEBAmWZhoNPBgcFAgEUDxcjKRIL
+ DwoFAgMEBAMBAQQDRBkqDgwNHDFEKQgOBzW8AwYLA4Fo/uSrCA8GNHyDhT4ESQUHBQE/VzcZ
+ ERshERRCLAQIBwYFBQMgPzcsDC0fExocCRMQBg4dLD8CAw0JChQSEgiOBgcEAQgODhcVEwn9
+ sB82KRcbEhwVCjVJVVVMGy9wOxQjJCYXUKaimEMcFx9RSTIcKi8SDF2BlYlsGRQsFhYjLSUr
+ GysjHQ1LfzY1BxYUDtSODhkFMnA9Dh4cGwsAAf+3/6MD1QYzAGgBgroATwBkAAMruwAzAAUA
+ QgAEK0EZABYATwAmAE8ANgBPAEYATwBWAE8AZgBPAHYATwCGAE8AlgBPAKYATwC2AE8AxgBP
+ AAxdQQMABgBPAAFdQQUA1QBPAOUATwACXbgATxC5AFoABvS4AArQuAAKL7gAWhC4AA/QuAAP
+ L7gATxC4ABXQuAAVL7gATxC4ABjQuAAYL7gATxC4ACjQuAAoL7oAKQBkAE8REjlBBQAaAEIA
+ KgBCAAJxQSEACQBCABkAQgApAEIAOQBCAEkAQgBZAEIAaQBCAHkAQgCJAEIAmQBCAKkAQgC5
+ AEIAyQBCANkAQgDpAEIA+QBCABBdQQMACQBCAAFxuABPELgAStC4AEovuABaELgAVdC4AFUv
+ uABaELgAX9C4AF8vuAAzELgAatwAuAASL7gAUi+4AABFWLgAOi8buQA6AAg+WbsABQABAGIA
+ BCu7AC4AAwBFAAQruAAFELgACtC4AAovugApAFIAEhESObgAYhC4AF/QuABfLzAxAzIeAjMy
+ PgI3LgI0NTQ2MzIWFRwBFz4DMzIWFRQGBw4DBxM+AzMyHgIVHAEOAyMiLgI1NBI1NCYjIg4C
+ BxQeAhUUBiMiJjU0PgI1NC4CJw4BIyI1ND4CNwUJEyUiCCAqLxgBAQETHh8aAj9iUUYjEQse
+ LhA4TF83BSxygIZAK0QwGQMFCQ4KCxgVDg86OTN6fHMrAQEBIyIUIQQEBAEBAgEmUCp0AgQH
+ BNEHBwcCBAUDN1xFKwYrNUc4DXZaCRAMCBALEyoQBhETFAj+iTBcSCwcSn9kR5mThGQ7BhIi
+ HEEBH+BRRChDVi1Fg3RhJGpvHikKKVqcflCwtbJRBANBCRoZEgD///+q/48DIwbuAiYAKgAA
+ AAcAdP82AWT///9W/+4CzwWKAiYA2wAAAAcAdP7iAAD///+8/48CrwZxAiYAKgAAAAcAiv8k
+ AW3///+V/+4CiAUEAiYA2wAAAAcAiv79AAD///+S/48CtwcRAiYAKgAAAAcA3/8FATn///9x
+ /+4ClgXYAiYA2wAAAAcA3/7kAAAAAf/w/k4CPwVkAEYBIrsADQAEACcABCu7AEQABgA0AAQr
+ uABEELgAANC4AAAvQQUAGgA0ACoANAACcUEhAAkANAAZADQAKQA0ADkANABJADQAWQA0AGkA
+ NAB5ADQAiQA0AJkANACpADQAuQA0AMkANADZADQA6QA0APkANAAQXUEDAAkANAABcbgANBC5
+ ADwAB/S4AAPQuAADL0EhAAYADQAWAA0AJgANADYADQBGAA0AVgANAGYADQB2AA0AhgANAJYA
+ DQCmAA0AtgANAMYADQDWAA0A5gANAPYADQAQXUEDAAYADQABcUEFABUADQAlAA0AAnG4ADQQ
+ uAAs0LgALC+4ADQQuAAv0LgALy8AuAA5L7gAAEVYuAAILxu5AAgACD5ZuwAQAAIAIgAEKzAx
+ ATIWFRQOAiMOAxUUFjMyPgI3NjMyFhUUBgcOAyMiLgI1ND4CNy4BNTwBPgE3NhI+ATMyFhUU
+ BgcOAxUUFgFtGRUUISwZIUM2IhodLGRmYSoKCAgICQskXmpvNiM9Lxs2UV4oBQEBAQEHDA8U
+ DzAuDRcFBgMCAgErNSYmTD0nHktNTB8SHRsyRSoKDwsMGw4tTTkgDRwqHTVuZFUbI3pkL2Rc
+ ShbCARazVE1LI188O3+AfzpIegAAAAAC/7b+TgIFBaAAQQBPAYS7ABsABAA1AAQruwBFAAcA
+ SwAEK0EFABoASwAqAEsAAnFBIQAJAEsAGQBLACkASwA5AEsASQBLAFkASwBpAEsAeQBLAIkA
+ SwCZAEsAqQBLALkASwDJAEsA2QBLAOkASwD5AEsAEF1BAwAJAEsAAXG6AD0ASwBFERI5uAA9
+ L0EFABoAPQAqAD0AAnFBIQAJAD0AGQA9ACkAPQA5AD0ASQA9AFkAPQBpAD0AeQA9AIkAPQCZ
+ AD0AqQA9ALkAPQDJAD0A2QA9AOkAPQD5AD0AEF1BAwAJAD0AAXG5AAUAB/S4AD0QuQAKAAf0
+ uAAP0LgADy9BIQAGABsAFgAbACYAGwA2ABsARgAbAFYAGwBmABsAdgAbAIYAGwCWABsApgAb
+ ALYAGwDGABsA1gAbAOYAGwD2ABsAEF1BAwAGABsAAXFBBQAVABsAJQAbAAJxALgAAEVYuAAU
+ Lxu5ABQACD5ZuAAARVi4ABYvG7kAFgAIPlm7AB4AAgAwAAQruwBCAAMASAAEKzAxATIeAhUU
+ DgIVFB4CFRQOAiMiJw4DFRQWMzI+Ajc2MzIWFRQGBw4DIyIuAjU0PgI3LgE1NBI+ARMyFhUU
+ BiMiJjU0PgIBAA0hHhQICwgDAwMFDx0XEQ0hQzciGh0sZGZhKgoICAgJCyReam82Iz0vGzpV
+ YScFBAUNGDctLUU2LjASIi4DthUgJxILXYadS2F5SCMJDBQOCA0eS01MIBIdGzJFKgoPCwwb
+ Di1NOSANHCodN3FnVRoeTi6jAQ/DawHqOyw5QjcwFywjFQAA//8Aw/+PAZ0G2QImACoAAAAH
+ AOD/EQE5//8A9f9xBY0FZgAmACoAAAAHACsCXAAA//8Apv3FA6gFoAAmAEoAAAAHAEsCGwAA
+ ////yf9xA8UHHgImACsAAAAHAGcASAE5AAL/K/3FAkoF5QA6AGQAkrsABwAGACwABCtBBQAa
+ ACwAKgAsAAJxQSEACQAsABkALAApACwAOQAsAEkALABZACwAaQAsAHkALACJACwAmQAsAKkA
+ LAC5ACwAyQAsANkALADpACwA+QAsABBdQQMACQAsAAFxugBTACwABxESOQC4AD4vuABaL7gA
+ AC+7ACUAAwARAAQrugBTAAAAPhESOTAxATIeBBUUDgIHDgMjIiYnLgM1ND4CMzIeBDMyPgQ1
+ NC4ENTQmNTQ+AgM+ATMyFhceAxceARUUDgIjIi4CJw4DBwYjIiY1NDY3PgMBEhwmGQ4HAQQI
+ DAkIGig3JUqESiUvGwoFDhYSDC89RUQ+FxYfFAsGAQYICwgGAQIIDg0LJRQRHgYPKzAyFhQR
+ CxIXCwszQEMZGD9HTSUWDw4NEBEPO0dKA8tXiquqlzBBkpeTQD5PLhEbFgoVFBMKCSAgFwkP
+ EA8JOl13eXEqIm6BiXldFhQrFRUnHBEB8xQTDxEqSDotDw4cDQwUDwkmRmA7L19dWCgXHRUX
+ MhMQQlZjAAD//wB//gwFxQUZAiYALAAAAAcA9gDjAAD//wCk/gwEBAZkAiYATAAAAAYA9gQA
+ AAAAAQCk/5YEBAQQAFcA0LsAJAAGAD8ABCtBIQAGACQAFgAkACYAJAA2ACQARgAkAFYAJABm
+ ACQAdgAkAIYAJACWACQApgAkALYAJADGACQA1gAkAOYAJAD2ACQAEF1BAwAGACQAAXFBBQAV
+ ACQAJQAkAAJxuAA/ELkAKQAH9LgAPxC4AC/QuAAvL7gAPxC4ADTQuAA0L7gAPxC4ADrQuAA6
+ L7gAJBC4AEnQuABJL7gAJBC4AEzQuABMLwC4AEQvugASACwAAyu4ABIQuAAV0LgAFS+4ABIQ
+ uQAcAAH0MDEBMhYVFAYHDgMHHgUzMjYzMhUUDgIjIi4CJy4BJx4DMRQGIyImJy4DJy4BNTQ2
+ NzQuAjU0PgIzMh4CFRQGFT4FNz4DA+MLEiYuHoGbnjwLKj1SY3ZEKzwRExswQyhckXhmMQgS
+ CQQJBwQnGh0SBAECAwMBERQUEQEBAQIKExEUFgoCAS53fnxmRwoVHRURA9UPFBUxIBU6Q0gi
+ DzlDRjklCg4MJSQaLk9oOgkMBYC1czY9Njg8Dl6QuGcCCxQOGg0XODk3FypHMhwlP1QvI0IW
+ FjM1MyoeBQsPCgUAAAD//wCm/7IE1gajAiYALQAAAAcAjwDXAIf////v/40CMAeXAGYATQDv
+ QAA2JwAHAI/+twF7//8Apv3SBNYFSgImAC0AAAAHAPYAkf/GAAIAff4MAaIGagAvAFQAzrsA
+ CAAGACIABCtBIQAGAAgAFgAIACYACAA2AAgARgAIAFYACABmAAgAdgAIAIYACACWAAgApgAI
+ ALYACADGAAgA1gAIAOYACAD2AAgAEF1BAwAGAAgAAXFBBQAVAAgAJQAIAAJxuAAIELgABdC4
+ AAUvuAAiELkAEQAH9LgAIhC4ABvQuAAbL7gAIhC4ACvQuAArL7gACBC5ADMABfS4AAgQuABG
+ 0LgARi+4ACIQuABQ0LgAUC8AuAA6L7gAAC+4ABYvuwAwAAEATgAEKzAxEzIeAhUUBhUUHgYV
+ FA4CIyIuAjU0LgQ1PAI2NDY8ATU0PgITMhYVFA4EIyI1ND4CNz4DNTQmIyIOAiMiNTQ+AvwT
+ FwwEAQMEBgcGBAMZIiIJCQwGAgEBAgEBAQEBCRJTLTcdMDs7NxIZBhEeGRkpHhENDgkNDA0K
+ Ew0ZKAZqFiMtFxEiDg53tN3m3rR6Dh0zJhYUHycTDTVHUlJNHxdoi6OmnH1SCRIyLiH5YUc2
+ KE9HPi0ZFQUOFBwVFTI2NhgOFAUGBRcJIB4XAP//AKb/sgTWBUoCJgAtAAAABwBuAi//Gv//
+ AM3/jQM/BmoAJgBNAAAABwBuAYcAAP//AKb/sgTWBUoCJgAtAAAABwCSAUgAj///AM3/jQM8
+ BmoAJgBNAAAABwCSAM8AAP//ANb/hwUMB1UCJgAvAAAABwCPAIUBOf//AM3/yQP6BnACJgBP
+ AAAABgCPcVQAAP//ANb+DAUMBbACJgAvAAAABwD2AO4AAP//AM3+DAP6A+MCJgBPAAAABgD2
+ cwAAAP//ANb/hwUMByUCJgAvAAAABwDeAL4BOf//AM3/yQP6BewCJgBPAAAABgDeRgAAAP//
+ AHb/yQP6BhMCJgBPAAAABwD2/xgGSAABANb+DgUMBbAAfgDkuwAbAAcAJAAEK7sAXgAHAAUA
+ BCu4AF4QuQAAAAX0QQUAGgAFACoABQACcUEhAAkABQAZAAUAKQAFADkABQBJAAUAWQAFAGkA
+ BQB5AAUAiQAFAJkABQCpAAUAuQAFAMkABQDZAAUA6QAFAPkABQAQXUEDAAkABQABcboACAAF
+ AF4REjm4ABsQuQApAAX0uAAkELgALtC4AC4vuAAFELgARdC4AEUvuAAAELkAYwAE9LgAW9C4
+ AFsvuABeELgAgNwAuABPL7sAegADAGgABCu7AEIAAwALAAQrugAIAAsAQhESOTAxBTQuAjU0
+ NjUOASMiLgQnLgMjIgYVERQGIyImJy4BNTQ+AjUuAzU0PgIzMh4CFx4DFx4DMzI2Nz4FNz4B
+ MzIeAhUUDgQHDgEVFB4CFRQOAiMiLgQ1NDYzMhYXHgMzMj4CBHUOEg4BFjgrI1hcXE48DhUp
+ JR0HEAsLFRclCg4KCgwKDxIKAwIHDgsPHRsaCwssTXVVVG9MMhccIgwIEQ8ODAoEBRERBxcU
+ DwYIDAoKAwsKCg0KHkVxUjhrYFE8ISERESsPH01SUiQrRC0YOVy1nXoiBAcDFyMyT2BbSxMa
+ MCQVLyP7/hYRIjI8kVVf1uf1fSE/NioNDBcSCxcqOCEiVGmCT05YKgkhHFqOcV1TTy04QRIb
+ HwwIMEJOTkgbashdccilfidipHZDHjJBRkQdHSQUGTRKLhYfRnQAAQDN/cUD+APjAF0A5bgA
+ Xi+4AF8vuAA13LkAAAAE9LgAXhC4ABzQuAAcL7kADQAE9EEhAAYADQAWAA0AJgANADYADQBG
+ AA0AVgANAGYADQB2AA0AhgANAJYADQCmAA0AtgANAMYADQDWAA0A5gANAPYADQAQXUEDAAYA
+ DQABcUEFABUADQAlAA0AAnG4AArQuAAKL7gAHBC4ABXQuAAVL7gADRC4ACbQuAAmL7gADRC4
+ ACnQuAApLwC4ACEvuAAwL7gAAEVYuAASLxu5ABIACD5ZuwBWAAMAQgAEK7gAMBC5AAMAA/S6
+ ACkAEgAhERI5MDEBNCYjIg4EBwYUFRQOAiMiJjU0PgQ1ND4CMzIeAhUUBhU+BTMyHgIVERwB
+ DgMHDgMjIiYnLgM1ND4CMzIeBDMyPgQ1A4AZHw9JX21mVhgCChUgFxsQAQECAQEJEh4VDBUO
+ CAIbSFNZVlAgJko6IwEDBQcFCB8tOyVKhUklLxsKBQ4WEgwvPEZEPhcTHBIKBQECtlJEIjhL
+ U1UmPn07V2w7FDorCk51kJiWQS1SPiQZKzceFEQtGz49OSsaLUhcL/6DKnB+hH1wKT5XNxkb
+ FgsUFBMKCSAgFwkPEA8JKEJXX2ArAAAA//8AOf/4BR8GPQImADAAAAAHAIoAmgE5//8ANf/j
+ BHsFBAImAFAAAAAHAIoAtAAA//8AOf/4BR8HEQImADAAAAAHAN8AgQE5//8ANf/jBH8F2AIm
+ AFAAAAAHAN8AzQAA//8AOf/4BR8HFQImADAAAAAHAOMAbwDf//8ANf/jBHsGNgImAFAAAAAG
+ AONWAAAA//8Ad/89BRsHvAImADMAAAAHAI8ALQGg//8Av//TBLoGLAImAFMAAAAGAI9vEAAA
+ //8Ad/4MBRsFSAImADMAAAAGAPZ/AAAA//8Av/4MBLoD2wImAFMAAAAGAPZ5AAAA//8Ad/89
+ BRsHdQImADMAAAAHAN4AUgGJ//8Av//TBLoF7AImAFMAAAAGAN5MAAAA//8ATv/bBZEHVQIm
+ ADQAAAAHAI8AlgE5//8ASP/TBAwGHAImAFQAAAAGAI/SAAAA//8ATv/bBZEHHgImADQAAAAH
+ AGcAlgE5//8ASP/TBAwF5QImAFQAAAAGAGfSAAAAAAEATv4vBZEFRgB3Adi7AE8ABQBJAAQr
+ uwAnAAUAPQAEK7sAIAAFAFsABCu6ABYASQAgERI5QQUAGgA9ACoAPQACcUEhAAkAPQAZAD0A
+ KQA9ADkAPQBJAD0AWQA9AGkAPQB5AD0AiQA9AJkAPQCpAD0AuQA9AMkAPQDZAD0A6QA9APkA
+ PQAQXUEDAAkAPQABcUEhAAYATwAWAE8AJgBPADYATwBGAE8AVgBPAGYATwB2AE8AhgBPAJYA
+ TwCmAE8AtgBPAMYATwDWAE8A5gBPAPYATwAQXUEDAAYATwABcUEFABUATwAlAE8AAnFBBQAa
+ AFsAKgBbAAJxQSEACQBbABkAWwApAFsAOQBbAEkAWwBZAFsAaQBbAHkAWwCJAFsAmQBbAKkA
+ WwC5AFsAyQBbANkAWwDpAFsA+QBbABBdQQMACQBbAAFxuAAgELgAedwAuAAARVi4AEQvG7kA
+ RAAIPlm7ADgAAQAsAAQruwAAAAEADQAEK7sAGwACAGAABCu4AEQQuQBUAAH0QSEABwBUABcA
+ VAAnAFQANwBUAEcAVABXAFQAZwBUAHcAVACHAFQAlwBUAKcAVAC3AFQAxwBUANcAVADnAFQA
+ 9wBUABBdQQMABwBUAAFxQQUAFgBUACYAVAACcTAxATIeAhUUDgIjIiY1DgcHPgMzMh4CFRQO
+ AgcWFRQOAiMiLgI1NDMyHgIzMj4CNTQnDgMjIi4CNTQ2MzIWFRQeAjMyPgQ1NC4CIyIOBCMi
+ LgI1ND4ENz4DBNUVLCYYER0pGA8THm6OpKObfVUMd/zpwz5gf00fN2CDTCFOgalbOFY6HhUJ
+ ECA6M2KebzsLRZOVkUNJgF43GQ8OGB5BZ0hl1s22ilAlQls2Qq26uZtwFBAcFAwnRmJ1hkh2
+ yJdiBUYSGhsJBRkaFA4RAiM6TlhdW1MhGy0fES1LZDYwZGBaKDlPZat8RRwtOh0tGyAbQ2yK
+ SCQeIDQmFCI/WTYUICgzCh4bEzNTam5pKBcrIBMUHiMeFA4jOCoTPEtVV1QlPU4tEQAAAQBI
+ /i8EDAPwAGMBg7gAZC+4AGUvuAAX3LgAZBC4ADXQuAA1L7kAHwAF9EEhAAYAHwAWAB8AJgAf
+ ADYAHwBGAB8AVgAfAGYAHwB2AB8AhgAfAJYAHwCmAB8AtgAfAMYAHwDWAB8A5gAfAPYAHwAQ
+ XUEDAAYAHwABcUEFABUAHwAlAB8AAnG4ABcQuQBOAAX0QQUAGgBOACoATgACcUEhAAkATgAZ
+ AE4AKQBOADkATgBJAE4AWQBOAGkATgB5AE4AiQBOAJkATgCpAE4AuQBOAMkATgDZAE4A6QBO
+ APkATgAQXUEDAAkATgABcQC4AAAvuAAARVi4AD8vG7kAPwAIPlm7ADAAAQAkAAQruwAUAAIA
+ UQAEK7gAFBC5AFYAA/S6AA8AFABWERI5uAA/ELkARwAD9EEhAAcARwAXAEcAJwBHADcARwBH
+ AEcAVwBHAGcARwB3AEcAhwBHAJcARwCnAEcAtwBHAMcARwDXAEcA5wBHAPcARwAQXUEDAAcA
+ RwABcUEFABYARwAmAEcAAnEwMQEyHgIVFAYHDgUHPgMzMhYVFA4CBx4BFRQOAiMiLgI1NDMy
+ HgIzMj4CNTQmJw4FIyIuAjU0NjMyPgQ1NCYjIg4CIyIuAjU0PgYC9BIdFAsVIzJ2eHNgRQ0i
+ hKWzUYB4HjRIKx8fToGpWzhWOh4VCRAgOjNinm87EBI1dXVvYEwXGB4QBSAfQKSpon5NRVlp
+ x6mEJg4YEgsuTWdxdmtaA/APFRkJFRgGCSczPkNDHwkgHxZYWilNSEEeI2c2Zat8RRwtOh0t
+ GyAbQ2yKSCBBFCA3LCMXDBghJA0aCyI6TlhcLCkkHyYfCRUkHCFKS0pDOSkYAAAC//791QUO
+ BWAARwBsAV64AG0vuABuL7gAbRC4AC7QuAAuL7kAIQAH9EEhAAYAIQAWACEAJgAhADYAIQBG
+ ACEAVgAhAGYAIQB2ACEAhgAhAJYAIQCmACEAtgAhAMYAIQDWACEA5gAhAPYAIQAQXUEDAAYA
+ IQABcUEFABUAIQAlACEAAnG4AADQuAAAL7gAbhC4AEvcuQBeAAX0QQUAGgBeACoAXgACcUEh
+ AAkAXgAZAF4AKQBeADkAXgBJAF4AWQBeAGkAXgB5AF4AiQBeAJkAXgCpAF4AuQBeAMkAXgDZ
+ AF4A6QBeAPkAXgAQXUEDAAkAXgABcboACABLAF4REjm4ABzQuAAcL7gAIRC4ACnQuAApL7oA
+ MwAuACEREjm4ACEQuABI0LgASC8AuAAAL7gAUi+4AABFWLgAKS8buQApAAg+WbsASAABAGYA
+ BCu7AD4AAwA2AAQrugAIAFIAABESOboAMwA2AD4REjkwMQEyHgIVFAYHPgM3PgMzMhYVFA4E
+ Bw4DFRQeAhUUBiMiLgI1ND4CNw4BIyIuAjU0NjMyPgI3PgMTMhYVFA4EIyI1ND4CNz4DNTQm
+ IyIOAiMiNTQ+AgKRDxMLBQEBKldRRxo2UTonCxcQRm6Jh3clBQYDAhATEBAZGDMpGwQGCgZn
+ uEctSzgfIB0udYeVTgcSExMhLTcdMDs7NxIZBhEeGRkpHhENDgkNDA0KEw0ZKAVgHjA7HBAd
+ DQoVFBIHDhgSCw0REzU7OzEjBT2Kgm0fc6p3SBEcKjR80Z4wb3Z5OhodGSImDBgVCxMbEDZc
+ Qib6NEc2KE9HPi0ZFQUOFBwVFTI2NhgOFAUGBRcJIB4XAAACAAL+DAMOBYsATQByARS7ADIA
+ BwA/AAQrQSEABgAyABYAMgAmADIANgAyAEYAMgBWADIAZgAyAHYAMgCGADIAlgAyAKYAMgC2
+ ADIAxgAyANYAMgDmADIA9gAyABBdQQMABgAyAAFxQQUAFQAyACUAMgACcbgAMhC5AEQABvS4
+ AAvQuABEELgAENC4ABAvuAAyELgAGtC4ABovuAAyELgAH9C4AB8vuAAyELgAZNC4AGQvuAAg
+ 0LgAIC+4AGQQuAA30LgANy+4ADIQuQBRAAX0uABEELgAbtC4AG4vALgAFS+4AFgvuAA6L7sA
+ TgABAGwABCu7AAsAAwBJAAQruAALELgAA9C4AAMvuAALELgABtC4AAYvuAALELgAINC4ACAv
+ MDETNDYzMhYzMj4CNz4DNTQ+AjMyHgIVFA4CHQE+AzMyFhUUDgIHDgMHDgMVFAYjIi4CNTQ+
+ AjcOAyMiLgIBMhYVFA4EIyI1ND4CNz4DNTQmIyIOAiMiNTQ+AgIQGRlFKwgiLTMaAQEBAQgN
+ EQkJGRUPAwQDRE0rFg0xNw4XHg8JLEFSLwMGBgQpJwoNCAQHCAgCFzMxLRI0PSEKAbktNx0w
+ Ozs3EhkGER4ZGSkeEQ0OCQ0MDQoTDRkoAxAQDwgDAwQCLWVcSxMqX080FCIxHB1zhYEqCwYG
+ BAEtGQ0PCgUCAgYJCgZXuqJ4FjgvGSs8Iz5wdoRRAgYFAx4nJfzDRzYoT0c+LRkVBQ4UHBUV
+ MjY2GA4UBQYFFwkgHhcAAAAC//7/dwUOByUARQBvALi7AB8ABwAsAAQrQSEABgAfABYAHwAm
+ AB8ANgAfAEYAHwBWAB8AZgAfAHYAHwCGAB8AlgAfAKYAHwC2AB8AxgAfANYAHwDmAB8A9gAf
+ ABBdQQMABgAfAAFxQQUAFQAfACUAHwACcboAMQAsAB8REjm6AF4ALAAfERI5ALgAZS+4ACcv
+ uABJL7gAAC+4ABAvuwA8AAMANAAEK7oABgAnAGUREjm6ADEANAA8ERI5ugBeACcAZRESOTAx
+ ATIWFRQGBz4DNz4DMzIWFRQOBAcOAxUUHgIVFAYjIi4CNTQ+AjcOASMiLgI1NDYzMj4CNz4D
+ Nw4BIyImJy4DJy4BNTQ+AjMyHgIXPgM3NjMyFhUUBgcOAwKNHhgBASpXUUcaNlE6JwsXEEZu
+ iYd3JQUGAwIWGxYQGRg4MiEEBgoGZ7hHLUs4HyAdLnWHlU4HERESAgwmFBEcBg8rMDIWFREL
+ EhYLCzVAQRgZP0dMJhYQDg0PEQ88R0oFBjQrCRMKChUUEgcOGBILDRETNTs7MSMFPYqCbR9z
+ x5plERsqUKDtnjBvdnk6Gh0ZIiYMGBULExsQNj8hClYUFBAQKUg6LQ8OHQ0MFA8IJ0VhOi9f
+ XVgoFx0VFjMTEUJVYgD//wAC/6QDwAYZACYAVQAAAAcAbgIIAAAAAf/+/3cFDgVgAGcAwrsA
+ UQAHAF4ABCu4AF4QuAAK0LgACi9BIQAGAFEAFgBRACYAUQA2AFEARgBRAFYAUQBmAFEAdgBR
+ AIYAUQCWAFEApgBRALYAUQDGAFEA1gBRAOYAUQD2AFEAEF1BAwAGAFEAAXFBBQAVAFEAJQBR
+ AAJxugANAF4AURESObgAURC4AEPQALgAIi+4AFkvuwAYAAMAEAAEK7sABQABAGEABCu6AA0A
+ EAAYERI5ugAqAFkAIhESObgAYRC4AF7QuABeLzAxEzIeAjMyPgI3PgE3DgEjIi4CNTQ2MzI+
+ Ajc+AzMyHgIVFAYHPgM3PgMzMhYVFA4EBw4DBz4DMzIWFRQGBw4BBx4DFRQGIyIuAicOASMi
+ NTQ+AuEFCRMlIgowPEAbAg0KZ7hHLUs4HyAdLnWHlU4HEhMTCg8TCwUBASpXUUcaNlE6JwsX
+ EEZuiYd3JQMGBAIBLEg/OB0RCx4uGm9PAxYaFBAZFzYwIwMxbDl0AgQHAkQHBwcEBggDV8Fe
+ Gh0ZIiYMGBULExsQNlxCJh4wOxwQHQ0KFRQSBw4YEgsNERM1OzsxIwUvZ2dgKAcMCQUQCxMq
+ EAkgD2u2jV0QGypKk9ySBgdBCRoZEgAAAAEAAv+kAw4FiwBvASC7AFsABABjAAQruABjELgA
+ CtC4AAovQSEABgBbABYAWwAmAFsANgBbAEYAWwBWAFsAZgBbAHYAWwCGAFsAlgBbAKYAWwC2
+ AFsAxgBbANYAWwDmAFsA9gBbABBdQQMABgBbAAFxQQUAFQBbACUAWwACcbgAWxC5ACcABfS4
+ AA3QuAANL7gAJxC4ACLQuAAiL7gAJxC5ADEABPS4ADbQuAA2L7gAMRC4AEfQuABHL7gAWxC4
+ AEjQuABIL7gAWxC4AFbQuABWL7gAYxC4AGbQuABmLwC4ACwvuABeL7sABQABAGkABCu7ACIA
+ AwASAAQruAAiELgAGtC4ABovuAAiELgAHdC4AB0vuAAiELgAN9C4ADcvuABpELgAZtC4AGYv
+ MDETMh4CMzI+Ajc+ATcOAyMiLgI1NDYzMhYzMj4CNz4DNTQ+AjMyHgIVFA4CHQE+AzMyFhUU
+ BgcOAwcDPgMzMhYVFAYHDgEHDgMVFAYjIi4CNTQ2Nw4BIyI1ND4CHwUJEyUiCis2PBsFCAIX
+ MzEtEjQ9IQoQGRlFKwgiLTMaAQEBAQgNEQkJGRUPAwQDRE0rFg0xNyQuCSxBUi8JM1JGPh8R
+ Cx4uHYJeAgMDASomCQ0IAwICLWAzdAIEBwGaBwcHAwYHA0GGTwIGBQMeJyUIEA8IAwMEAi1l
+ XEsTKl9PNBQiMRwdc4WBKgsGBgQBLRkXDwcCBgkKBv7tBw4LBhALEyoQCiUQNF1LNQs3Lx82
+ SCovVCcFBUEJGhkSAAD//wDO/7wEzwbFAiYANgAAAAcAdABaATv//wCE/90D/QWKAiYAVgAA
+ AAYAdBAAAAD//wDZ/7wEzwZaAiYANgAAAAcAigDBAVb//wDD/90DtgUEAiYAVgAAAAYAiisA
+ AAD//wDZ/7wEzwcRAiYANgAAAAcA3wCoATn//wCf/90DxAXYAiYAVgAAAAYA3xIAAAD//wDZ
+ /7wEzwbrAiYANgAAAAcA4QB5ATn//wDN/90DsgWyAiYAVgAAAAYA4eYAAAD//wDZ/7wEzwdv
+ AiYANgAAAAcA4wCFATn//wDN/90DsgY2AiYAVgAAAAYA4/MAAAAAAQDZ/k4E/QWBAHcB8rsA
+ DAAGAGoABCu7AEMABABdAAQruwAvAAcAJwAEK0EhAAYADAAWAAwAJgAMADYADABGAAwAVgAM
+ AGYADAB2AAwAhgAMAJYADACmAAwAtgAMAMYADADWAAwA5gAMAPYADAAQXUEDAAYADAABcUEF
+ ABUADAAlAAwAAnG6AHMAagAMERI5uABzL7kAAwAE9EEFABoAJwAqACcAAnFBIQAJACcAGQAn
+ ACkAJwA5ACcASQAnAFkAJwBpACcAeQAnAIkAJwCZACcAqQAnALkAJwDJACcA2QAnAOkAJwD5
+ ACcAEF1BAwAJACcAAXG6AB0AJwAvERI5uAAdL0EFABoAHQAqAB0AAnFBIQAJAB0AGQAdACkA
+ HQA5AB0ASQAdAFkAHQBpAB0AeQAdAIkAHQCZAB0AqQAdALkAHQDJAB0A2QAdAOkAHQD5AB0A
+ EF1BAwAJAB0AAXG5ADkABvRBIQAGAEMAFgBDACYAQwA2AEMARgBDAFYAQwBmAEMAdgBDAIYA
+ QwCWAEMApgBDALYAQwDGAEMA1gBDAOYAQwD2AEMAEF1BAwAGAEMAAXFBBQAVAEMAJQBDAAJx
+ ugBiAGoAORESObgAedwAuAAARVi4ACovG7kAKgAOPlm7AEYAAgBYAAQruwARAAMAZQAEK7oA
+ YgBlABEREjkwMQEyFhUUDgYVFB4CMzI+BDc+AzU0LgQnLgE1NDYzMh4CFRQGBx4FFRQOAgcO
+ AxUUFjMyPgI3NjMyFhUUBgcOAyMiLgI1ND4CNw4BIyIuAjU0PgY1PgMBUCIkBwsPDw4LBxEr
+ SDYtZWZkVkUVICMQAwsSFhUTBQgMFh8WIRYLAwUFEhUVEAscMkUqI1RIMBodLGRmYSoKCAgI
+ CQskXmpvNiM9LxseMj8hZtRbUF8yDwYJDA0MCQcBAwsTBQ5LWw1Nb4mPj3xgGiU1IxALExgb
+ GgwSMT1FJh1gdX95aCMyaC0wPjNPXioaLhAdZ4OYm5dAJ0Q5MRMbUlxeJhIdGzJFKgoPCwwb
+ Di1NOSANHCodJ1BNSB8YFTBUc0MZY4OYmpR5VQ8eLB0PAAAAAAEAzf5OA9YD/gBvAgO7AAoA
+ BQBrAAQruwA9AAQAVwAEK7sALwAFACAABCtBIQAGAAoAFgAKACYACgA2AAoARgAKAFYACgBm
+ AAoAdgAKAIYACgCWAAoApgAKALYACgDGAAoA1gAKAOYACgD2AAoAEF1BAwAGAAoAAXFBBQAV
+ AAoAJQAKAAJxQQUAGgAgACoAIAACcUEhAAkAIAAZACAAKQAgADkAIABJACAAWQAgAGkAIAB5
+ ACAAiQAgAJkAIACpACAAuQAgAMkAIADZACAA6QAgAPkAIAAQXUEDAAkAIAABcbgAIBC4ABvQ
+ uAAbL7gALxC4ACjQuAAoL0EhAAYAPQAWAD0AJgA9ADYAPQBGAD0AVgA9AGYAPQB2AD0AhgA9
+ AJYAPQCmAD0AtgA9AMYAPQDWAD0A5gA9APYAPQAQXUEDAAYAPQABcUEFABUAPQAlAD0AAnG4
+ AGsQuABk0LgAZC+6AFwAZAAoERI5uAAvELgAcdwAuAAARVi4ACMvG7kAIwAMPlm4AABFWLgA
+ Xy8buQBfAAg+WbsAQAACAFIABCu4AF8QuQAPAAP0QSEABwAPABcADwAnAA8ANwAPAEcADwBX
+ AA8AZwAPAHcADwCHAA8AlwAPAKcADwC3AA8AxwAPANcADwDnAA8A9wAPABBdQQMABwAPAAFx
+ QQUAFgAPACYADwACcboAXABfAA8REjkwMRMyFhUUDgQVFB4CMzI+BDc+AzU0LgI1NDYzMh4C
+ FRQGFAYUBhUUDgIHBgcOBRUUFjMyPgI3NjMyFhUUBgcOAyMiLgI1ND4CNw4BIyIuAjU8ATY0
+ NjQ1ND4C/B0tAwYFBgMOGycZHU5TVEg4DQcJBQICAgIiFwwSDAcBAgEbLz8lAgQXODg1KRka
+ HSxkZmEqCggICAkLJF5qbzYjPS8bIzdGJEV6JDM+IAoBAQMKEQOcQD8VT2NtZ1gcKTUeCwcO
+ FRohFAozSFgwNm1gTBVOPxUgJxMMUnSLjYQxHzYuKBACAhEwO0FCPhsSHRsyRSoKDwsMGw4t
+ TTkgDRwqHSpWUkwgEA8lOkQgFVVrdm5bGSVLOiUA//8AOv+WB6gHHgImADgAAAAHAGcBiQE5
+ //8AHP/JBboF5QImAFgAAAAHAGcAkQAA//8AHf7wBUwHHgImADoAAAAHAGcAWgE5////lP3L
+ A8gF5QImAFoAAAAGAGebAAAA//8ACv9iBo4HVQImADsAAAAHAI8BBAE5//8AG//dBFQGHAIm
+ AFsAAAAGAI/tAAAA//8ACv9iBo4G2QImADsAAAAHAOABPQE5//8AG//dBFQFoAImAFsAAAAG
+ AOAlAAAAAAEAF/+8A0YGeQBGAT24AEcvuABIL7gARxC4AADQuAAAL7gASBC4AAzcuQAZAAb0
+ QQUAGgAZACoAGQACcUEhAAkAGQAZABkAKQAZADkAGQBJABkAWQAZAGkAGQB5ABkAiQAZAJkA
+ GQCpABkAuQAZAMkAGQDZABkA6QAZAPkAGQAQXUEDAAkAGQABcbgAABC5ACMABPRBIQAGACMA
+ FgAjACYAIwA2ACMARgAjAFYAIwBmACMAdgAjAIYAIwCWACMApgAjALYAIwDGACMA1gAjAOYA
+ IwD2ACMAEF1BAwAGACMAAXFBBQAVACMAJQAjAAJxuAAo0LgAKC+4AAAQuAAy0LgAMi+4AAAQ
+ uAA10LgANS8AuAAtL7sABwACABwABCu7AEYAAwA5AAQruAAHELgAEdy4ADkQuAA20LgANi+4
+ AEYQuABB0LgAQS8wMQE+BTMyHgIVFA4CIyImNTQ3PgE1NCYjIg4DAhUUHgIVFA4CIyIuAjU0
+ Nj0BDgEjIi4CNTQ2Nz4DNwFGBiQ0QUpNJiI7LRoKFyQaEBgECAsPEx88Ni4hEwQEBAIPIB0U
+ GAwEASA5GDVILBMkHw8hNEw6A0Sd9bZ9TiIhMDgXGEQ/LBUTCwsXQR4gLBxKgMf+6btpu5t3
+ JA0qKR1RirloN3E6IAICCRIcEx8eAgECAgICAP//ACP/pggcB3wCJgChAAAABwCPAlIBYP//
+ AAz/xQc5BmQCJgDBAAAABwCPAqAASP//ADn+4QUfB1UCJgCzAAAABwCPAFIBOf//ADX+yQR7
+ BhwCJgDTAAAABgCP/wAAAP//AE7+DAWRBUYCJgA0AAAABwD2AQgAAP//AEj+DAQMA/ACJgBU
+ AAAABgD2OQAAAAAC//791QUOBWAARwBsAV64AG0vuABuL7gAbRC4AC7QuAAuL7kAIQAH9EEh
+ AAYAIQAWACEAJgAhADYAIQBGACEAVgAhAGYAIQB2ACEAhgAhAJYAIQCmACEAtgAhAMYAIQDW
+ ACEA5gAhAPYAIQAQXUEDAAYAIQABcUEFABUAIQAlACEAAnG4AADQuAAAL7gAbhC4AEvcuQBe
+ AAX0QQUAGgBeACoAXgACcUEhAAkAXgAZAF4AKQBeADkAXgBJAF4AWQBeAGkAXgB5AF4AiQBe
+ AJkAXgCpAF4AuQBeAMkAXgDZAF4A6QBeAPkAXgAQXUEDAAkAXgABcboACABLAF4REjm4ABzQ
+ uAAcL7gAIRC4ACnQuAApL7oAMwAuACEREjm4ACEQuABI0LgASC8AuAAAL7gAUi+4AABFWLgA
+ KS8buQApAAg+WbsASAABAGYABCu7AD4AAwA2AAQrugAIAFIAABESOboAMwA2AD4REjkwMQEy
+ HgIVFAYHPgM3PgMzMhYVFA4EBw4DFRQeAhUUBiMiLgI1ND4CNw4BIyIuAjU0NjMyPgI3PgMT
+ MhYVFA4EIyI1ND4CNz4DNTQmIyIOAiMiNTQ+AgKRDxMLBQEBKldRRxo2UTonCxcQRm6Jh3cl
+ BQYDAhATEBAZGDMpGwQGCgZnuEctSzgfIB0udYeVTgcSExMhLTcdMDs7NxIZBhEeGRkpHhEN
+ DgkNDA0KEw0ZKAVgHjA7HBAdDQoVFBIHDhgSCw0REzU7OzEjBT2Kgm0fc6p3SBEcKjR80Z4w
+ b3Z5OhodGSImDBgVCxMbEDZcQib6NEc2KE9HPi0ZFQUOFBwVFTI2NhgOFAUGBRcJIB4XAAAC
+ AAL+DAMOBYsATQByARS7ADIABwA/AAQrQSEABgAyABYAMgAmADIANgAyAEYAMgBWADIAZgAy
+ AHYAMgCGADIAlgAyAKYAMgC2ADIAxgAyANYAMgDmADIA9gAyABBdQQMABgAyAAFxQQUAFQAy
+ ACUAMgACcbgAMhC5AEQABvS4AAvQuABEELgAENC4ABAvuAAyELgAGtC4ABovuAAyELgAH9C4
+ AB8vuAAyELgAZNC4AGQvuAAg0LgAIC+4AGQQuAA30LgANy+4ADIQuQBRAAX0uABEELgAbtC4
+ AG4vALgAFS+4AFgvuAA6L7sATgABAGwABCu7AAsAAwBJAAQruAALELgAA9C4AAMvuAALELgA
+ BtC4AAYvuAALELgAINC4ACAvMDETNDYzMhYzMj4CNz4DNTQ+AjMyHgIVFA4CHQE+AzMyFhUU
+ DgIHDgMHDgMVFAYjIi4CNTQ+AjcOAyMiLgIBMhYVFA4EIyI1ND4CNz4DNTQmIyIOAiMiNTQ+
+ AgIQGRlFKwgiLTMaAQEBAQgNEQkJGRUPAwQDRE0rFg0xNw4XHg8JLEFSLwMGBgQpJwoNCAQH
+ CAgCFzMxLRI0PSEKAbktNx0wOzs3EhkGER4ZGSkeEQ0OCQ0MDQoTDRkoAxAQDwgDAwQCLWVc
+ SxMqX080FCIxHB1zhYEqCwYGBAEtGQwPCgYCAgYJCgZXuqJ4FjgvGSs8Iz5wdoRRAgYFAx4n
+ JfzDRzYoT0c+LRkVBQ4UHBUVMjY2GA4UBQYFFwkgHhcAAAABAGoBVANeAhcAIAAXALsADwAD
+ ABoABCu4ABoQuQAFAAH0MDETMh4CMzI+Ajc+AzMyFhUUBgcOAyMiNTQ+An0FCRMlIg1DT0oV
+ QGRSRiMRCx4uGGiTt2l1AgQIAeMGCAYGCAkDCRANCBALEysQCB4eFkIIGhkSAP//AKT/mAY7
+ BtkCJgAjAAAABwDgARsBOf//AGz/qgTRBjsCJgBDAAAABgDgVgAAAP//AIf/sgWaBtkCJgAl
+ AAAABwDgAMsBOf//ADr/lgeoB00CJgA4AAAABwBBAcUBOf//ADr/lgeoB1UCJgA4AAAABwCP
+ AYkBOf//ADX/gQSzBkgCJgBFAAAABwDgAJEAAP//AB3+8AVMB00CJgA6AAAABwBBAJgBOf//
+ APb/UgUSBtkCJgAnAAAABwDgAFQBOf//ABf/vANGBwgCJgBHAAAABwDg/zwBaP//ANH/RgV7
+ BtkCJgAuAAAABwDgAQoBOf//AKX/rAXTBaACJgBOAAAABwDgAS8AAP//AE7/WAUrBtkCJgAx
+ AAAABwDgAJMBOf//ABz/yQW6BhQCJgBYAAAABwBBAM0AAP//AMz9sgWPBaACJgBRAAAABwDg
+ ALwAAP//ABz/yQW6BhwCJgBYAAAABwCPAJEAAP//AE7/2wWRBtkCJgA0AAAABwDgANEBOf//
+ /5T9ywPIBhQCJgBaAAAABgBB1gAAAP//ADr/lgeoBswCJgA4AAAABwCDAcMBOf//ABz/yQW6
+ BZMCJgBYAAAABwCDAMsAAP//AEj/0wQMBaACJgBUAAAABgDgCgAAAP////7/dwUOBtkCJgA1
+ AAAABwDgADkBOf//AAL/pAMOBr8CJgBVAAAABwDg/2MBHwACAG0DbwJgBg4AIQBAAIy7AAUA
+ BQAVAAQrQSEABgAFABYABQAmAAUANgAFAEYABQBWAAUAZgAFAHYABQCGAAUAlgAFAKYABQC2
+ AAUAxgAFANYABQDmAAUA9gAFABBdQQMABgAFAAFxQQUAFQAFACUABQACcbgABRC5ACcAB/S5
+ ADcABfS4AAUQuAA+0LgAPi8AuAAiL7gACi8wMRMyHgIVFA4CIyImNTQ2Nz4DNTQuAiMiJjU0
+ PgI3Mh4CFRQOAiMiJjU0Njc+AzU0LgQ1NDbdFTIrHi9FTR8OEh8OJC0YCQoWIxkLBQYOF74f
+ TEAsHS87Hw4UIA0SFw4GFiAnIBYMBbApTWtCL2VUNiINDBsOIjY0OCUWOjUlEwgEDxAMXjhb
+ cjpDaUkmDA0NGBAWJSgzJDBKOi0lIhIIEAAAAgDu/9sCBQV1ACAAOACSugADACwAAyu4AAMQ
+ uAAA0LgAAC+4AAMQuQAUAAf0uAADELkAGwAH9LgAAxC4ACTQuAAkL0EFANoALADqACwAAl1B
+ GwAJACwAGQAsACkALAA5ACwASQAsAFkALABpACwAeQAsAIkALACZACwAqQAsALkALADJACwA
+ DV0AuAAeL7gAAEVYuAApLxu5ACkACD5ZMDEBFhQVFA4EBw4DIyIuAjU0PgQ3PgEzMhYDMhYV
+ FA4CIyImNTQ+Ajc+Azc+AQIEAQMGCQwPCQgWGRoLCxALBgcLDQwJAgUWECU1SBYoKTpDGR0u
+ BQ0WEQ8PDhEPER8E/gwiFDSQn5+GYA8OHRgPECU9LjJ/iIh2WxdVZDz7vyYuIEY8JyogECUm
+ Iw8NBwIECwwVAAAAABMA6gABAAAAAAAAADYAAAABAAAAAAABABAANgABAAAAAAACAAcARgAB
+ AAAAAAADABwATQABAAAAAAAEABAANgABAAAAAAAFAAwAaQABAAAAAAAGAA8AdQABAAAAAAAQ
+ ABAANgABAAAAAAARAAcARgABAAAAAAASABAANgADAAEECQAAAGwAhAADAAEECQABACAA8AAD
+ AAEECQACAA4BEAADAAEECQADADgBHgADAAEECQAEACAA8AADAAEECQAFABgBVgADAAEECQAG
+ AB4BbgADAAEECQAQACAA8AADAAEECQARAA4BEKkgMjAwOSBNYXJrIFNpbW9uc29uIFN0dWRp
+ byBMTEMuICBBbGwgcmlnaHRzIHJlc2VydmVkLlNrZXRjaEZsb3cgUHJpbnRSZWd1bGFybWxz
+ czogU2tldGNoRmxvdyBQcmludDogMjAwOFZlcnNpb24gMS4wMVNrZXRjaEZsb3dQcmludACp
+ ACAAMgAwADAAOQAgAE0AYQByAGsAIABTAGkAbQBvAG4AcwBvAG4AIABTAHQAdQBkAGkAbwAg
+ AEwATABDAC4AIAAgAEEAbABsACAAcgBpAGcAaAB0AHMAIAByAGUAcwBlAHIAdgBlAGQALgBT
+ AGsAZQB0AGMAaABGAGwAbwB3ACAAUAByAGkAbgB0AFIAZQBnAHUAbABhAHIAbQBsAHMAcwA6
+ ACAAUwBrAGUAdABjAGgARgBsAG8AdwAgAFAAcgBpAG4AdAA6ACAAMgAwADAAOABWAGUAcgBz
+ AGkAbwBuACAAMQAuADAAMQBTAGsAZQB0AGMAaABGAGwAbwB3AFAAcgBpAG4AdAAAAAIAAAAA
+ AAD/ZgBmAAAAAAAAAAAAAAAAAAAAAAAAAAABjgAAAQIAAgADAAYABwAIAAkACgALAAwADQAO
+ AA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAAp
+ ACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBE
+ AEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgBf
+ AGAAYQEDAMQApgDFAKsAggDCANgAxgDkAL4AsADmALYAtwC0ALUAhwCyALMA2QCMAOUAvwCx
+ AOcAuwEEAKMAhACFAL0AlgDoAIYAjgCLAJ0AqQCkAQUAigEGAIMAkwDyAPMAjQCXAIgBBwDe
+ APEAngCqAPUA9AD2AKIArQDJAMcArgBiAGMAkABkAMsAZQDIAMoAzwDMAM0AzgDpAGYA0wDQ
+ ANEArwBnAPAAkQDWANQA1QBoAOsA7QCJAGoAaQBrAG0AbABuAKAAbwBxAHAAcgBzAHUAdAB2
+ AHcA6gB4AHoAeQB7AH0AfAC4AKEAfwB+AIAAgQDsAO4AugDXAOIA4wDhANsA3ADdAOAA3wEI
+ AJ8AmwC8AJgAmgCZAO8ApQCSAJwApwCPAJQAlQC5AMAAwQEJAQoBCwEMAQ0BDgEPAP0A/gEQ
+ AREBEgETAP8BAAEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjAPgA+QEkASUBJgEn
+ ASgBKQEqASsBLAEtAS4BLwEwATEBMgEzATQBNQE2ATcBOAE5AToBOwE8AT0BPgE/AUABQQFC
+ AUMBRAFFAUYBRwFIAUkBSgFLAUwBTQFOAU8BUAFRAVIBUwFUAVUBVgFXAVgBWQFaAVsBXAD7
+ APwBXQFeAV8BYAFhAWIBYwFkAWUBZgFnAWgBaQFqAWsBbAFtAW4BbwFwAXEBcgFzAXQBdQF2
+ AXcBeAF5AXoBewF8AX0BfgF/AYABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGR
+ AZIBkwGUAZUBlgAFAAQFLm51bGwERXVybwd1bmkwMEEwB3VuaTAwQUQGbWFjcm9uDnBlcmlv
+ ZGNlbnRlcmVkBURlbHRhC2NvbW1hYWNjZW50B0FtYWNyb24HYW1hY3JvbgZBYnJldmUGYWJy
+ ZXZlB0FvZ29uZWsHYW9nb25lawtDY2lyY3VtZmxleAtjY2lyY3VtZmxleApDZG90YWNjZW50
+ CmNkb3RhY2NlbnQGRGNhcm9uBmRjYXJvbgZEY3JvYXQGZGNyb2F0B0VtYWNyb24HZW1hY3Jv
+ bgZFYnJldmUGZWJyZXZlCkVkb3RhY2NlbnQKZWRvdGFjY2VudAdFb2dvbmVrB2VvZ29uZWsG
+ RWNhcm9uBmVjYXJvbgtHY2lyY3VtZmxleAtnY2lyY3VtZmxleApHZG90YWNjZW50Cmdkb3Rh
+ Y2NlbnQMR2NvbW1hYWNjZW50DGdjb21tYWFjY2VudAtIY2lyY3VtZmxleAtoY2lyY3VtZmxl
+ eARIYmFyBGhiYXIGSXRpbGRlBml0aWxkZQdJbWFjcm9uB2ltYWNyb24GSWJyZXZlBmlicmV2
+ ZQdJb2dvbmVrB2lvZ29uZWsKSWRvdGFjY2VudAJJSgJpagtKY2lyY3VtZmxleAtqY2lyY3Vt
+ ZmxleAxLY29tbWFhY2NlbnQMa2NvbW1hYWNjZW50DGtncmVlbmxhbmRpYwZMYWN1dGUGbGFj
+ dXRlDExjb21tYWFjY2VudAxsY29tbWFhY2NlbnQGTGNhcm9uBmxjYXJvbgRMZG90BGxkb3QG
+ TmFjdXRlBm5hY3V0ZQxOY29tbWFhY2NlbnQMbmNvbW1hYWNjZW50Bk5jYXJvbgZuY2Fyb24L
+ bmFwb3N0cm9waGUDRW5nA2VuZwdPbWFjcm9uB29tYWNyb24GT2JyZXZlBm9icmV2ZQ1PaHVu
+ Z2FydW1sYXV0DW9odW5nYXJ1bWxhdXQGUmFjdXRlBnJhY3V0ZQxSY29tbWFhY2NlbnQMcmNv
+ bW1hYWNjZW50BlJjYXJvbgZyY2Fyb24GU2FjdXRlBnNhY3V0ZQtTY2lyY3VtZmxleAtzY2ly
+ Y3VtZmxleAxUY29tbWFhY2NlbnQMdGNvbW1hYWNjZW50BlRjYXJvbgZ0Y2Fyb24EVGJhcgR0
+ YmFyBlV0aWxkZQZ1dGlsZGUHVW1hY3Jvbgd1bWFjcm9uBlVicmV2ZQZ1YnJldmUFVXJpbmcF
+ dXJpbmcNVWh1bmdhcnVtbGF1dA11aHVuZ2FydW1sYXV0B1VvZ29uZWsHdW9nb25lawtXY2ly
+ Y3VtZmxleAt3Y2lyY3VtZmxleAtZY2lyY3VtZmxleAt5Y2lyY3VtZmxleAZaYWN1dGUGemFj
+ dXRlClpkb3RhY2NlbnQKemRvdGFjY2VudAVsb25ncwdBRWFjdXRlB2FlYWN1dGULT3NsYXNo
+ YWN1dGULb3NsYXNoYWN1dGUMU2NvbW1hYWNjZW50DHNjb21tYWFjY2VudAd1bmkwMjFBB3Vu
+ aTAyMUIJYWZpaTAwMjA4B3VuaTFFMDIHdW5pMUUwMwd1bmkxRTBBBldncmF2ZQZXYWN1dGUH
+ dW5pMUUwQgZZZ3JhdmUHdW5pMUUxRQd1bmkxRTFGB3VuaTFFNDAHdW5pMUU0MQd1bmkxRTU2
+ BndncmF2ZQd1bmkxRTU3BndhY3V0ZQd1bmkxRTYwBnlncmF2ZQlXZGllcmVzaXMJd2RpZXJl
+ c2lzB3VuaTFFNjEHdW5pMUU2QQd1bmkxRTZCAAAAAAMACAACABAAAf//AAMAAAABAAEAAQAA
+ AAEAABuIAAAAFAAAAAAAABuAMIIbfAYJKoZIhvcNAQcCoIIbbTCCG2kCAQExCzAJBgUrDgMC
+ GgUAMGEGCisGAQQBgjcCAQSgUzBRMCwGCisGAQQBgjcCARyiHoAcADwAPAA8AE8AYgBzAG8A
+ bABlAHQAZQA+AD4APjAhMAkGBSsOAwIaBQAEFOs0nyJL0HdvP/6cYj6/kqVPXaKfoIIWRzCC
+ BBIwggL6oAMCAQICDwDBAIs8PIgR0T72Y+zfQDANBgkqhkiG9w0BAQQFADBwMSswKQYDVQQL
+ EyJDb3B5cmlnaHQgKGMpIDE5OTcgTWljcm9zb2Z0IENvcnAuMR4wHAYDVQQLExVNaWNyb3Nv
+ ZnQgQ29ycG9yYXRpb24xITAfBgNVBAMTGE1pY3Jvc29mdCBSb290IEF1dGhvcml0eTAeFw05
+ NzAxMTAwNzAwMDBaFw0yMDEyMzEwNzAwMDBaMHAxKzApBgNVBAsTIkNvcHlyaWdodCAoYykg
+ MTk5NyBNaWNyb3NvZnQgQ29ycC4xHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEh
+ MB8GA1UEAxMYTWljcm9zb2Z0IFJvb3QgQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOC
+ AQ8AMIIBCgKCAQEAqQK9wXDmO/JOGyifl3heMOqiqY0lX/j+lUyjt/6doiA+fFGim6KPYDJr
+ 0UJkee6sdslU2vLrnIYcj5+EZrPFa3piI9YdPN4PAZLolsS/LWaammgmmdA6LL8MtVgmwUbn
+ Cj44liypKDmo7EmDQuOED7uabFVhrIJ8oWAtd0zpmbRkO5pQHDEIJBSfqeeRKxjmPZhjFGBY
+ BWWfHTdSh/en75QCxhvTv1VFs4mAvzrsVJROrv2nem10Tq8YzJYJKCEAV5BgaTe7SxIHPFb/
+ W/ukZgoIptKBVlfvtjteFoF3BNr2vq6Alf6wzX/WpxpyXDzKvPAIoyIwswaFybMgdxOF3wID
+ AQABo4GoMIGlMIGiBgNVHQEEgZowgZeAEFvQcO9pcp4jUX4Usk2O/8uhcjBwMSswKQYDVQQL
+ EyJDb3B5cmlnaHQgKGMpIDE5OTcgTWljcm9zb2Z0IENvcnAuMR4wHAYDVQQLExVNaWNyb3Nv
+ ZnQgQ29ycG9yYXRpb24xITAfBgNVBAMTGE1pY3Jvc29mdCBSb290IEF1dGhvcml0eYIPAMEA
+ izw8iBHRPvZj7N9AMA0GCSqGSIb3DQEBBAUAA4IBAQCV6AvAjfOXGDXtuAEk2HcR81xgMp+e
+ C8s+BZGIj8k65iHy8FeTLLWgR8hi7/zXzDs7Wqk2VGn+JG0/ycyq3gV83TGNPZ8QcGq7/hJP
+ GGnA/NBD4xFaIE/qYnuvqhnIKzclLb5loRKKJQ9jo/dUHPkhydYV81KsbkMyB/2CF/jlZ2wN
+ Ufa98VLHvefEMPwgMQmIHZUpGk3VHQKl8YDgA7Rb9LHdyFfuZUnHUlS2tAMoEv+Q1vAIj364
+ l8WrNyzkeuSod+N2oADQaj/B0jaK4EESqDVqG2rbNeHUHATkqEUEyFozOG5NHA1itwqijNPV
+ VD9GzRxVpnDbEjqHk3Wfp9KgMIIEYDCCA0ygAwIBAgIKLqsR3FD/XJ3LwDAJBgUrDgMCHQUA
+ MHAxKzApBgNVBAsTIkNvcHlyaWdodCAoYykgMTk5NyBNaWNyb3NvZnQgQ29ycC4xHjAcBgNV
+ BAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEhMB8GA1UEAxMYTWljcm9zb2Z0IFJvb3QgQXV0
+ aG9yaXR5MB4XDTA3MDgyMjIyMzEwMloXDTEyMDgyNTA3MDAwMFoweTELMAkGA1UEBhMCVVMx
+ EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv
+ c29mdCBDb3Jwb3JhdGlvbjEjMCEGA1UEAxMaTWljcm9zb2Z0IENvZGUgU2lnbmluZyBQQ0Ew
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3eX3WXbNFOag0rDHa+SU1SXfA+x+e
+ x0Vx79FG6NSMw2tMUmL0mQLDTdhJbC8kPmW/ziO3C0i3f3XdRb2qjw5QxSUr8qDnDSMf0UEk
+ +mKZzxlFpZNKH5nNsy8iw0otfG/ZFR47jDkQOd29KfRmOy0BMv/+J0imtWwBh5z7urJjf4L5
+ XKCBhIWOsPK4lKPPOKZQhRcnh07dMPYAPfTG+T2BvobtbDmnLjT2tC6vCn1ikXhmnJhzDYav
+ 8sTzILlPEo1jyyzZMkUZ7rtKljtQUxjOZlF5qq2HyFY+n4JQiG4FsTXBeyS9UmY9mU7MK34z
+ boRHBtGe0EqGAm6GAKTAh99TAgMBAAGjgfowgfcwEwYDVR0lBAwwCgYIKwYBBQUHAwMwgaIG
+ A1UdAQSBmjCBl4AQW9Bw72lyniNRfhSyTY7/y6FyMHAxKzApBgNVBAsTIkNvcHlyaWdodCAo
+ YykgMTk5NyBNaWNyb3NvZnQgQ29ycC4xHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
+ bjEhMB8GA1UEAxMYTWljcm9zb2Z0IFJvb3QgQXV0aG9yaXR5gg8AwQCLPDyIEdE+9mPs30Aw
+ DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUzB3OdgBwW6/x2sROmlFELqNEY/AwCwYDVR0P
+ BAQDAgGGMAkGBSsOAwIdBQADggEBAHurrn5KJvLOvE50olgndCp1s4b9q0yUeABN6crrGNxp
+ xQ6ifPMCQ8bKh8z4U8zCn71Wb/BjRKlEAO6WyJrVHLgLnxkNlNfaHq0pfe/tpnOsj945jj2Y
+ arw4bdKIryP93+nWaQmRiL3+4QC7NPP3fPkQEi4F6ymWk0JrKHG3OI/gBw3JXWjNvYBBa2ao
+ u7e7jjTK8gMQfHr10uBC33v+4eGs/vbf1Q2zcNaS40+2OKJ8LdQ92zQLYjcCn4FqI4n2XGOP
+ sFq7OddgjFWEGjP1O5igggyiX4uzLLehpcur2iC2vzAZhSAUDSq8UvRB4F4w45IoaYfBcOLz
+ p6vOgEJydg4wggR6MIIDYqADAgECAgphBieBAAAAAAAIMA0GCSqGSIb3DQEBBQUAMHkxCzAJ
+ BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD
+ VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBDb2RlIFNp
+ Z25pbmcgUENBMB4XDTA4MTAyMjIxMjQ1NVoXDTEwMDEyMjIxMzQ1NVowgYMxCzAJBgNVBAYT
+ AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
+ aWNyb3NvZnQgQ29ycG9yYXRpb24xDTALBgNVBAsTBE1PUFIxHjAcBgNVBAMTFU1pY3Jvc29m
+ dCBDb3Jwb3JhdGlvbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL1ytInnHJ+F
+ x3S4YFwDNj2c/Zl6milGIrCnh1Pt7kY6x1sFC1eot8oFzNNMd0dwhbPly99n56P9dCeTZ5/X
+ igNEMMb3ybrJOh0IVkRPFwgN+bQZaKokHPsFV4XpxU4HITen684sL7ZCzSEFp9bm0yhXxxt6
+ zik2B82eVcy78SLrqCOkDSnC+9DDWj5jPccsSQt7eYXwiO9xvUNa46OzDfNV+yXg4iDT55pe
+ lKUzLSh/VxtVagwyRO9mbG/wOJzvAq2aod2YBxAOPBhp4nlORhTguYzQdW2crACcLUL1Ubha
+ 9HhFg+kufCu7Xc0ZYSitlEMKxWpC/7UyrqQpIt4W6NMCAwEAAaOB+DCB9TATBgNVHSUEDDAK
+ BggrBgEFBQcDAzAdBgNVHQ4EFgQUI9FzKky9++Uh+nEemRXRF/nEpoowDgYDVR0PAQH/BAQD
+ AgeAMB8GA1UdIwQYMBaAFMwdznYAcFuv8drETppRRC6jRGPwMEQGA1UdHwQ9MDswOaA3oDWG
+ M2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL0NTUENBLmNybDBI
+ BggrBgEFBQcBAQQ8MDowOAYIKwYBBQUHMAKGLGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w
+ a2kvY2VydHMvQ1NQQ0EuY3J0MA0GCSqGSIb3DQEBBQUAA4IBAQBDKc9jvWzjc23DmddtDIg7
+ xkhzeiXOLOI3e500n70jzr7f2Fx5EWsTUSABY7ly9wjjxn1RKhYo1NHnmyrPGA3SE3GRKexW
+ vfnWxQ0vr2UtbU1FKVZyhE8/0modQWKpeVyO8Md3issCKC6dx5wr5bkqCd3sl+Lleo1eEIhT
+ od1gT3eYcWCoWzmR06sSHwXpw0Wp08JRua+43PwGhAD0dKPb/8wdoCMFB+QnNcKXkBmqgmAn
+ 6PuEKx7RBMuOz4IN16hNQ0B10t7dd++KXGsPh2SPtLq3uqtnVCFFqkpo51ReixRcZ3jskFwD
+ EJEInSQgl+jfABFwqfmycnC3ruLCnxYCMIIEnTCCA4WgAwIBAgIQaguZT8AAJasR20UfWHpn
+ ojANBgkqhkiG9w0BAQUFADBwMSswKQYDVQQLEyJDb3B5cmlnaHQgKGMpIDE5OTcgTWljcm9z
+ b2Z0IENvcnAuMR4wHAYDVQQLExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xITAfBgNVBAMTGE1p
+ Y3Jvc29mdCBSb290IEF1dGhvcml0eTAeFw0wNjA5MTYwMTA0NDdaFw0xOTA5MTUwNzAwMDBa
+ MHkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k
+ MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBU
+ aW1lc3RhbXBpbmcgUENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3Ddu+6/I
+ QkpxGMjOSD5TwPqrFLosMrsST1LIg+0+M9lJMZIotpFk4B9QhLrCS9F/Bfjvdb6Lx6jVrmlw
+ ZngnZui2t++Fuc3uqv0SpAtZIikvz0DZVgQbdrVtZG1KVNvd8d6/n4PHgN9/TAI3lPXAnghW
+ HmhHzdnAdlwvfbYlBLRWW2ocY/+AfDzu1QQlTTl3dAddwlzYhjcsdckO6h45CXx2/p1sbnrg
+ 7D6Pl55xDl8qTxhiYDKe0oNOKyJcaEWL3i+EEFCy+bUajWzuJZsT+MsQ14UO9IJ2czbGlXqi
+ zGAG7AWwhjO3+JRbhEGEWIWUbrAfLEjMb5xD4GrofyaOawIDAQABo4IBKDCCASQwEwYDVR0l
+ BAwwCgYIKwYBBQUHAwgwgaIGA1UdAQSBmjCBl4AQW9Bw72lyniNRfhSyTY7/y6FyMHAxKzAp
+ BgNVBAsTIkNvcHlyaWdodCAoYykgMTk5NyBNaWNyb3NvZnQgQ29ycC4xHjAcBgNVBAsTFU1p
+ Y3Jvc29mdCBDb3Jwb3JhdGlvbjEhMB8GA1UEAxMYTWljcm9zb2Z0IFJvb3QgQXV0aG9yaXR5
+ gg8AwQCLPDyIEdE+9mPs30AwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFG/oTj+XuTSr
+ S4aPvJzqrDtBQ8bQMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIBhjAP
+ BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQCUTRExwnxQuxGOoWEHAQ6McEWN
+ 73NUvT8JBS3/uFFThRztOZG3o1YL3oy2OxvR+6ynybexUSEbbwhpfmsDoiJG7Wy0bXwiuEbT
+ hPOND74HijbB637pcF1Fn5LSzM7djsDhvyrNfOzJrjLVh7nLY8Q20Rghv3beO5qzG3OeIYjY
+ tLQSVIz0nMJlSpooJpxgig87xxNleEi7z62DOk+wYljeMOnpOR3jifLaOYH5EyGMZIBjBgSW
+ 8poCQy97Roi6/wLZZflK3toDdJOzBW4MzJ3cKGF8SPEXnBEhOAIch6wGxZYyuOVAxlM9vamJ
+ 3uhmN430IpaczLB3VFE61nJEsiP2MIIEqjCCA5KgAwIBAgIKYQaULQAAAAAACTANBgkqhkiG
+ 9w0BAQUFADB5MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH
+ UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSMwIQYDVQQDExpNaWNy
+ b3NvZnQgVGltZXN0YW1waW5nIFBDQTAeFw0wODA3MjUxOTAyMTdaFw0xMzA3MjUxOTEyMTda
+ MIGzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
+ ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMQ0wCwYDVQQLEwRNT1BSMScwJQYD
+ VQQLEx5uQ2lwaGVyIERTRSBFU046N0E4Mi02ODhBLTlGOTIxJTAjBgNVBAMTHE1pY3Jvc29m
+ dCBUaW1lLVN0YW1wIFNlcnZpY2UwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV
+ gQogQhhRetmV7Zv93IfR+w6PE+qqNygSdv5NUKt2lyqTR+CpVmkC5ZR+TYXbf3HvdQDbu0Ns
+ +2+scfAr0XySzpQXnaHFuvn3ft1h4S0wHpwmLXY/5kaWjq7YiTfYzO/zz1vD/Gjg8mSPm+jD
+ EvmjvoT81ovOBT29AXZQJwP4hLcWho1gvl0pLDzPpf2YWjUdTxbAONgeYT89NrNWFBV3lTsQ
+ +gCwk+JdN6snu2MsSBSBVeNs6qkrlY2IDn6jAKV3JAeYKnADuCokkJrexaIiS79MWQZ3VHJD
+ sD5k3ZOECFi2/umHSQk2s7P4M6l+TKJ5fzJZKQ6etfXgPJ4/7EY7AgMBAAGjgfgwgfUwHQYD
+ VR0OBBYEFCiViL8CO+valLp9Rg/6y/R+nf/RMB8GA1UdIwQYMBaAFG/oTj+XuTSrS4aPvJzq
+ rDtBQ8bQMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kv
+ Y3JsL3Byb2R1Y3RzL3RzcGNhLmNybDBIBggrBgEFBQcBAQQ8MDowOAYIKwYBBQUHMAKGLGh0
+ dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvdHNwY2EuY3J0MBMGA1UdJQQMMAoG
+ CCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIGwDANBgkqhkiG9w0BAQUFAAOCAQEAAO6s/OLSiGbK
+ KeNauc0Agn4XXMUkWRK7qPdr14f+jcu1dh8bIvb34cq0uUEBGjetSDeWcPrMM6cojLgLtnQT
+ KLezdeEqCeKLT9+YP5e3NBKB6hDdHdy6ZM9OUDtMiv0Z3SWu1ZaH6kvE5fD5QRddAetXiH12
+ euVv/ocgrJOcjJq/XxqgFTAk4KJ+YZEdKSnDSZA6Q4OJ7t7Vg91PLDU750FBAaoADAvy1kkb
+ zkKNe7DzLY1dKeG+jX+RFXa0YPsUJ6pvEmNCKFg6ijuLQOS3xcySVxxGVmuPy5JNVgUAyvgw
+ QEVO3xmIvfUQ8N0a3ygetFHyd+Am47sJgRLcHjrQRTGCBKcwggSjAgEBMIGHMHkxCzAJBgNV
+ BAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK
+ ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBDb2RlIFNpZ25p
+ bmcgUENBAgphBieBAAAAAAAIMAkGBSsOAwIaBQCggdIwFAYJKwYBBAGCNygBMQcDBQADAAAA
+ MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3
+ AgEVMCMGCSqGSIb3DQEJBDEWBBRA83YH9zWifCdN+xiYdc3c9pa+7TBcBgorBgEEAYI3AgEM
+ MU4wTKAigCAAUwBrAGUAdABjAGgARgBsAG8AdwAgAFAAcgBpAG4AdKEmgCRodHRwOi8vd3d3
+ Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeSAwDQYJKoZIhvcNAQEBBQAEggEAXKvhnszsMG/f
+ lv6gyS7+PPFAjyp8kuEISw6CTGIAxChvojlIhPkjiyWvw3zgrV/JE5kVg/6ROx/xn8W0/faz
+ OA2B4yU8omPuX7CprhLDdwEJPLQikDaCpKXdLl11LZ9eRJJZh0rjC40QaF9Qr7Y4MnPmk3jz
+ D9lPIxaFGfcZqAypgpbyPlYSmMB9LnwUjIwvDczBr2jP99IoLRGs+USHu2vrEcnLcVwXZzLA
+ CHqHwVlfN4jMq4+wjo1mCBKGlNtsVl4t4+Gp12Mqp8AZZxbiUQRHw4zk3iyimjMlJen2EWiI
+ kV1f0ZMSWkU3FOw20453vNlaoHp/O9vO9GWPS63LTKGCAh8wggIbBgkqhkiG9w0BCQYxggIM
+ MIICCAIBATCBhzB5MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE
+ BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSMwIQYDVQQDExpN
+ aWNyb3NvZnQgVGltZXN0YW1waW5nIFBDQQIKYQaULQAAAAAACTAHBgUrDgMCGqBdMBgGCSqG
+ SIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTA5MDQxNDIzMDczMlowIwYJ
+ KoZIhvcNAQkEMRYEFIB5PGyFhl+De9pBQ1C1u2EhaKGkMA0GCSqGSIb3DQEBBQUABIIBACYz
+ FgAdiULyBn6tvxNY/UgNt5hcFrnczU+Abm8Vm40K9mUuF22L05ztiXpL3Pdr9jW/0TtRU/Tp
+ 4Kp7+1e1jcAYbFLa5EApdU/Ule8fMFnvkxylOQMTSpq7nuZFDQhMsb6zNoXO8pnZVmG2Saqq
+ 4qMkYAbOteby9pW44qjGuEYnuN0wAcSiJ9eAlunOaAfao5jHSi9JCkVBB2z6KOhnl8PySC8X
+ gAeeFO6WmYHSHPNSgxVqLn6TbLtnNhc3+q3DYlYa7Dby+PQ+77uCyQBSp2NDncBucAzQ7F/j
+ s2XGNW0IPmq1ZvmCCuaFYRmdCx7NLxZSMlBxyayObMBFuYVjS7QAAQAAAAoAHgAsAAFsYXRu
+ AAgABAAAAAD//wABAAAAAWtlcm4ACAAAAAEAAAABAAQAAgAAAAMADAO6BtwAAQ3gAAQAAAA/
+ AIgAngC0ALoAwADSANgA8gD4AQoBGAEyATwBQgFMAVIBYAF2AYwBogGoAcIByAHOAdQB2gH0
+ AgICEAIWAhwCIgIoAi4CNAJOAlQCbgJ0Ao4ClAKaAqACpgKsArICwALGAuAC7gMIAxIDIAMu
+ A0gDTgNgA2YDbANyA4ADjgOUAAUAFf++ABj/fQAa/x0AN/99AFf/zwAFABX/vgAY/20AGv6q
+ ADf/XABX/30AAQBS/x0AAQA3/7AABAAb/54AHP+NADL/HQBS/roAAQA3/88ABgAb/48AHP+N
+ ADL/TgBS/x0AV/9/AFn/bwABADf/zwAEABv/jwAc/7AAMv9vAFL/HQADABv/oAAc/14AMv9e
+ AAYAG/9tABz/bQAy/04AUv6aAFf/bQBZ/ysAAgAb/7AAUv9cAAEAUv9vAAIAG//PAFL/rgAB
+ ABv/zwADABv/sAAc/88AUv9/AAUAFf++ABj/fQAa/x0AN/99AFf/zwAFABX/vgAY/30AGv8d
+ ADf/fQBX/88ABQAV/74AGP9tABr+qgA3/1wAV/99AAEAN//PAAYAG/9tABz/bQAy/04AUv6a
+ AFf/bQBZ/ysAAQA3/88AAQA3/88AAQA3/88AAQA3/88ABgAb/20AHP9tADL/TgBS/poAV/9t
+ AFn/KwADABv/sAAc/88AUv9/AAMAG/+wABz/zwBS/38AAQA3/7AAAQA3/7AAAQA3/7AAAQA3
+ /88AAQA3/88AAQA3/88ABgAb/48AHP+NADL/TgBS/x0AV/9/AFn/bwABAFL/bwAGABv/jwAc
+ /40AMv9OAFL/HQBX/38AWf9vAAEAUv9vAAYAG/+PABz/jQAy/04AUv8dAFf/fwBZ/28AAQA3
+ /88AAQA3/88AAQA3/88AAQA3/88AAQA3/88AAQA3/88AAwAb/6AAHP9eADL/XgABABv/zwAG
+ ABv/bQAc/20AMv9OAFL+mgBX/20AWf8rAAMAG/+wABz/zwBS/38ABgAb/48AHP+NADL/TgBS
+ /x0AV/9/AFn/bwACABv/sABS/1wAAwAb/6AAHP9eADL/XgADABv/oAAc/14AMv9eAAYAG/9t
+ ABz/bQAy/04AUv6aAFf/bQBZ/ysAAQBS/x0ABAAb/54AHP+NADL/HQBS/roAAQAb/88AAQAb
+ /88AAQA3/88AAwAb/7AAHP/PAFL/fwADABv/oAAc/14AMv9eAAEAG//PAAYAG/+PABz/jQAy
+ /04AUv8dAFf/fwBZ/28AAQq0AAQAAAAMACIAOABOAGQAegCQAKYAvADSAQADAgMMAAUADf8t
+ AA//bQBh/y0AY/8tAGT/bQAFAA3/oAAP/7AAYf+gAGP/oABk/7AABQAN/z0AD/9MAGH/PQBj
+ /z0AZP9MAAUADf78AA//DABh/vwAY/78AGT/DAAFAA3/sAAP/48AYf+wAGP/sABk/48ABQAN
+ /uwAD/7bAGH+7ABj/uwAZP7bAAUADf+NAA//wQBh/40AY/+NAGT/wQAFADr/zwB6/88AuP/P
+ AWb/zwF8/88ACwAN/48ADv+NAA//jwBh/48AY/+PAGT/jwBy/40Ac/+NAJL/jQDr/40Bdf+N
+ AIAADf8MAA7/PQAP/14AIv+NACT/bQAo/zsAK/+uADT/jQA2/64AQv89AET/XgBF/04ARv9O
+ AEj/XgBQ/14AU/+gAFT/bwBW/38AWv++AGH/DABj/wwAZP9eAGn/jQBy/z0Ac/89AHb/bwB4
+ /14Akv89AJv/jQCc/40Anf+NAJ7/jQCf/40AoP+NAKH/jQCi/20AtP+uALX/rgC2/64At/+u
+ ALv/PQC8/z0Avf89AL7/PQC//z0AwP89AMH/PQDC/14Aw/9OAMT/TgDF/04Axv9OAM3/XgDO
+ /14Az/9eAND/XgDR/14A0/9eANT/fwDV/38A1v9/ANf/fwDY/74A2v++AOT/jQDr/z0A9/+N
+ APj/PQD5/40A+v89APv/jQD8/z0A/f9tAP7/XgD//20BAP9eAQH/bQEC/14BA/9tAQT/XgEG
+ /04BCP9OAQr/TgEM/04BDv9OARD/TgES/04BE/87ART/XgEV/zsBFv9eARf/OwEY/14BGf87
+ ARr/XgEq/64BQf9eAUP/XgFF/14BR/+gAUn/oAFL/6ABTP+NAU3/bwFO/40BT/9vAVD/jQFR
+ /28BWP+uAVn/fwFa/64BW/9/AVz/rgFd/38BXv+uAV//fwFg/64BYf9/AWL/rgFj/38BZ/++
+ AW3/jQFu/z0BcP9eAXX/PQF7/04Bhf+NAYb/vgACAEsAcQErAHEABQAN/64AD/++AGH/rgBj
+ /64AZP++AAIHrgAEAAAIzguWABwAIAAA/3//fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/oP+PAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/6D/wQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAA/30AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD/O/9O/4//Xv+u/2//f//P/17/rv9t/54AAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/74AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+w/7AAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8d/14AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD/wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ /4/+1wAAAAAAAAAAAAAAAP/PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP8M/tv/DP7L/uz+qv78/1z/Tv8t/x3/XgAA/67/vv+N/43/nv9e/0wAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAA/88AAP++AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/07/b/8t/x3/DP89/z3/Tv9O/z3/XP+e
+ AAD/sP+P/6D/Tv89/33/Lf9O/2//Lf+u/88AAAAAAAAAAAAA/8H/jwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP++AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/G/7N
+ AAAAAAAAAAAAAAAA/23/XP8d/20AAAAAAAAAAAAAAAAAAP9vAAAAAAAA/43/ngAAAAAAAAAA
+ AAAAAAAA/sv/DP66/qr+uv66/sv+y/78/y3/DP9eAAD/XP8b/wz+/P78/z3+7P9t/yv+7P89
+ /2//bf++/48AAAAAAAAAAP8t/04AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/sP/BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8H/LQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/40AAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAD/Xv9vAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAA/z3/XgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/f/8EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/j/9tAAD/oAAAAAD/wwAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/6D/jQAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP9v
+ /17/rv+u/7j/j//BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAP8d/roAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/bQAAAAAAAAAAAAAAAAAA/43/fQAA
+ AAAAAAAA/30AAP+NAAD/Hf89AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/54AAAAAAAAAAAAA
+ AAAAAP++AAAAAAAAAAAAAP/PAAD/jQAA/2//TgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQA/AA0ADwAnAC0AMQA0ADUANgA3
+ ADgAOgBDAFUAVwBYAFoAYQBjAGQAaQB6ALQAtQC2ALcAuADYANoA3AEvATEBTAFOAVABUgFT
+ AVQBVQFWAVgBWgFcAV4BYAFiAWQBZQFmAWcBcwF3AXkBegF8AX0BgQGCAYQBhQGGAYcBiAGK
+ AAEADAARABQAFQAWABcAGAAZABsAMgA3AFIAVwABAI4ADQAOAA8AIgAjACQAJQAnACgAKQAt
+ ADAAMQA0ADUANgA4ADoAQwBEAEcAUABRAFMAVABVAFgAWgBhAGMAZABpAHIAcwB2AHoAkgCb
+ AJwAnQCeAJ8AoACiAKsArQCuAK8AsACxALMAtAC1ALYAtwC4AMIAzQDOAM8A0ADRANMA2ADZ
+ ANoA3ADkAOsA9wD5APsA/QD+AP8BAAEBAQIBAwEEAQUBBwETARUBFwEZARsBHQEvATEBQAFB
+ AUIBQwFEAUUBRwFJAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVgBWgFcAV4BYAFiAWQBZQFm
+ AWcBbAFvAXABcwF1AXYBdwF4AXkBegF8AX0BfgGBAYIBgwGEAYUBhgGHAYgBigACAHYADQAN
+ ABoADgAOABsADwAPABkAIwAjAAEAJAAkAAIAJQAlAAMAJwAnAAQAKAAoAAUAKQApAAYALQAt
+ AAcAMAAwAAgAMQAxAAkANAA0AAoANQA1AAsANgA2AAwAOAA4AA0AOgA6AA4AQwBDAA8ARABE
+ ABAARwBHABEAUABQABIAUQBRABMAUwBTABQAVABUABUAVQBVABYAWABYABcAWgBaABgAYQBh
+ ABoAYwBjABoAZABkABkAaQBpAAoAcgBzABsAdgB2ABUAegB6AA4AkgCSABsAogCiAAIAqwCr
+ AAMArQCxAAgAswCzAAgAtAC3AAwAuAC4AA4AwgDCABAAzQDRABIA0wDTABIA2ADYABgA2QDZ
+ ABMA2gDaABgA3ADcAAcA6wDrABsA/QD9AAIA/gD+ABAA/wD/AAIBAAEAABABAQEBAAIBAgEC
+ ABABAwEDAAIBBAEEABABBQEFAAMBBwEHAAMBEwETAAUBFQEVAAUBFwEXAAUBGQEZAAUBGwEb
+ AAYBHQEdAAYBLwEvAAcBMQExAAcBQAFAAAgBQQFBABIBQgFCAAgBQwFDABIBRAFEAAgBRQFF
+ ABIBRwFHABQBSQFJABQBSwFLABQBTAFMAAoBTQFNABUBTgFOAAoBTwFPABUBUAFQAAoBUQFR
+ ABUBUgFSAAsBUwFTABYBVAFUAAsBVQFVABYBVgFWAAsBWAFYAAwBWgFaAAwBXAFcAAwBXgFe
+ AAwBYAFgAAwBYgFiAAwBZAFkAA0BZQFlABcBZgFmAA4BZwFnABgBbAFsABEBbwFvAAgBcAFw
+ ABIBcwFzAAsBdQF1ABsBdgF2AAEBdwF3AA8BeAF4AAMBeQF6AA0BfAF8AA4BfQF9AAQBfgF+
+ ABEBgQGBAAkBggGCABcBgwGDABMBhAGEABcBhQGFAAoBhgGGABgBhwGHAA0BiAGIABcBigGK
+ AAsAAQANAX4ABAAWAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAA
+ AAwAAAAAAAAADQAAAAAADgAAAAAAAAAAABUAAAAAAAAAGgABABsAAAAPAAAAAgAeAAAAAAAA
+ AAAAAAAAAAYAAAAHAAgACQAfAAoAAAAAAAAAAAAAABwAEAAFABEAAAASABMAHQAUAAAAFwAA
+ ABgAGQAAAAAAAAAAAAAABAAAAAQAAwAAAAAAAAAAABoAAAAVAB4AAAAAAAAAAAAAABYAFgAA
+ AAAAEwAAAAUAGQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAWAAAAAAAAAAAAAAAAAAAAAAALAAsACwALAAsACwALAAwAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAVABUAFQAVABUAAAAVABsAGwAbABsAAgAAAAAABgAGAAYABgAGAAYABgAHAAkACQAJ
+ AAkAAAAAAAAAAAAAABAABQAFAAUABQAFAAAABQAUABQAFAAUABgAAAAYAAAAAAAAAAAAAAAA
+ AAAAAAAAAAsAAAAAAAAAAAAAAAAAFgAAAAAAAAAAAAAAAAAAAAAAHwAfAAAACwAGAAsABgAL
+ AAYADAAHAAwABwAMAAcADAAHAAAACAAAAAgAAAAJAAAACQAAAAkAAAAJAAAACQANAAoADQAK
+ AA0ACgANAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAABAAAAAQAAAAEAAAAAAAAAAVAAUAFQAFABUABQAAABIAAAASAAAAEgAa
+ ABMAGgATABoAEwABAB0AAQAdAAEAAAAbABQAGwAUABsAFAAbABQAGwAUABsAFAAPABcAAgAY
+ AB4AGQAeABkAHwALAAYAFQAFAAAAAAABAAAAFgAAAAAAAAAPAA8ACAACAAAAHwAAABwAAAAX
+ ABEAFwAaABgADwAXAAAAAQABAAAACgAeACwAAWxhdG4ACAAEAAAAAP//AAEAAAABbGlnYQAI
+ AAAAAQAAAAEABAAEAAAAAQAIAAEAGgABAAgAAgAGAAwA9AACAEoA9QACAE0AAQABAEc=
+ </office:binary-data>
+ <svg:font-face-format svg:string="truetype"/>
+ </svg:font-face-uri>
+ </svg:font-face-src>
+ </style:font-face>
+ </office:font-face-decls>
+ <office:styles>
+ <style:default-style style:family="graphic">
+ <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.3cm" draw:shadow-offset-y="0.3cm" draw:start-line-spacing-horizontal="0.283cm" draw:start-line-spacing-vertical="0.283cm" draw:end-line-spacing-horizontal="0.283cm" draw:end-line-spacing-vertical="0.283cm" style:flow-with-text="false"/>
+ <style:paragraph-properties style:text-autospace="ideograph-alpha" style:line-break="strict" style:font-independent-line-spacing="false">
+ <style:tab-stops/>
+ </style:paragraph-properties>
+ <style:text-properties style:use-window-font-color="true" style:font-name="SketchFlow Print" fo:font-size="12pt" fo:language="en" fo:country="US" style:letter-kerning="true" style:font-name-asian="SketchFlow Print" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="SketchFlow Print" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN"/>
+ </style:default-style>
+ <style:default-style style:family="paragraph">
+ <style:paragraph-properties fo:orphans="2" fo:widows="2" fo:hyphenation-ladder-count="no-limit" style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="1.251cm" style:writing-mode="page"/>
+ <style:text-properties style:use-window-font-color="true" style:font-name="SketchFlow Print" fo:font-size="12pt" fo:language="en" fo:country="US" style:letter-kerning="true" style:font-name-asian="SketchFlow Print" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="SketchFlow Print" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2"/>
+ </style:default-style>
+ <style:default-style style:family="table">
+ <style:table-properties table:border-model="collapsing"/>
+ </style:default-style>
+ <style:default-style style:family="table-row">
+ <style:table-row-properties fo:keep-together="auto"/>
+ </style:default-style>
+ <style:style style:name="Standard" style:family="paragraph" style:class="text"/>
+ <style:style style:name="Heading" style:family="paragraph" style:parent-style-name="Standard" style:next-style-name="Text_20_body" style:class="text">
+ <style:paragraph-properties fo:margin-top="0.423cm" fo:margin-bottom="0.212cm" loext:contextual-spacing="false" fo:keep-with-next="always"/>
+ <style:text-properties style:font-name="SketchFlow Print" fo:font-family="&apos;SketchFlow Print&apos;" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="14pt" style:font-name-asian="SketchFlow Print" style:font-family-asian="&apos;SketchFlow Print&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="14pt" style:font-name-complex="SketchFlow Print" style:font-family-complex="&apos;SketchFlow Print&apos;" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="Text_20_body" style:display-name="Text body" style:family="paragraph" style:parent-style-name="Standard" style:class="text">
+ <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0.247cm" loext:contextual-spacing="false" fo:line-height="115%"/>
+ </style:style>
+ <style:style style:name="List" style:family="paragraph" style:parent-style-name="Text_20_body" style:class="list">
+ <style:text-properties style:font-size-asian="12pt" style:font-name-complex="SketchFlow Print" style:font-family-complex="&apos;SketchFlow Print&apos;" style:font-family-generic-complex="swiss"/>
+ </style:style>
+ <style:style style:name="Caption" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">
+ <style:paragraph-properties fo:margin-top="0.212cm" fo:margin-bottom="0.212cm" loext:contextual-spacing="false" text:number-lines="false" text:line-number="0"/>
+ <style:text-properties fo:font-size="12pt" fo:font-style="italic" style:font-size-asian="12pt" style:font-style-asian="italic" style:font-name-complex="SketchFlow Print" style:font-family-complex="&apos;SketchFlow Print&apos;" style:font-family-generic-complex="swiss" style:font-size-complex="12pt" style:font-style-complex="italic"/>
+ </style:style>
+ <style:style style:name="Index" style:family="paragraph" style:parent-style-name="Standard" style:class="index">
+ <style:paragraph-properties text:number-lines="false" text:line-number="0"/>
+ <style:text-properties style:font-size-asian="12pt" style:font-name-complex="SketchFlow Print" style:font-family-complex="&apos;SketchFlow Print&apos;" style:font-family-generic-complex="swiss"/>
+ </style:style>
+ </office:styles>
+ <office:automatic-styles>
+ <style:style style:name="T1" style:family="text">
+ <style:text-properties style:font-name="SketchFlow Print"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:body>
+ <office:text>
+ <text:p><text:span text:style-name="T1">Sketchflow</text:span></text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/footnote.fodt b/writerperfect/qa/unit/data/writer/epubexport/footnote.fodt
new file mode 100644
index 000000000..a846d64ed
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/footnote.fodt
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:body>
+ <office:text>
+ <text:p>before<text:note text:id="ftn0" text:note-class="footnote"><text:note-citation>1</text:note-citation><text:note-body><text:p>Footnote content</text:p></text:note-body></text:note>after</text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/fxl-2page.fodt b/writerperfect/qa/unit/data/writer/epubexport/fxl-2page.fodt
new file mode 100644
index 000000000..40f628b5e
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/fxl-2page.fodt
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:font-face-decls>
+ <style:font-face style:name="Lucida Sans1" svg:font-family="&apos;Lucida Sans&apos;" style:font-family-generic="swiss"/>
+ <style:font-face style:name="Liberation Serif" svg:font-family="&apos;Liberation Serif&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+ <style:font-face style:name="Liberation Sans" svg:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="swiss" style:font-pitch="variable"/>
+ <style:font-face style:name="AR PL SungtiL GB" svg:font-family="&apos;AR PL SungtiL GB&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ <style:font-face style:name="Lucida Sans" svg:font-family="&apos;Lucida Sans&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:styles>
+ <style:default-style style:family="graphic">
+ <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.3cm" draw:shadow-offset-y="0.3cm" draw:start-line-spacing-horizontal="0.283cm" draw:start-line-spacing-vertical="0.283cm" draw:end-line-spacing-horizontal="0.283cm" draw:end-line-spacing-vertical="0.283cm" style:flow-with-text="false"/>
+ <style:paragraph-properties style:text-autospace="ideograph-alpha" style:line-break="strict" style:font-independent-line-spacing="false">
+ <style:tab-stops/>
+ </style:paragraph-properties>
+ <style:text-properties style:use-window-font-color="true" style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="en" fo:country="US" style:letter-kerning="true" style:font-name-asian="AR PL SungtiL GB" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Lucida Sans" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN"/>
+ </style:default-style>
+ <style:default-style style:family="paragraph">
+ <style:paragraph-properties fo:orphans="2" fo:widows="2" fo:hyphenation-ladder-count="no-limit" style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="1.251cm" style:writing-mode="page"/>
+ <style:text-properties style:use-window-font-color="true" style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="en" fo:country="US" style:letter-kerning="true" style:font-name-asian="AR PL SungtiL GB" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Lucida Sans" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2"/>
+ </style:default-style>
+ <style:default-style style:family="table">
+ <style:table-properties table:border-model="collapsing"/>
+ </style:default-style>
+ <style:default-style style:family="table-row">
+ <style:table-row-properties fo:keep-together="auto"/>
+ </style:default-style>
+ <style:style style:name="Standard" style:family="paragraph" style:class="text"/>
+ <style:style style:name="Heading" style:family="paragraph" style:parent-style-name="Standard" style:next-style-name="Text_20_body" style:class="text">
+ <style:paragraph-properties fo:margin-top="0.423cm" fo:margin-bottom="0.212cm" loext:contextual-spacing="false" fo:keep-with-next="always"/>
+ <style:text-properties style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="14pt" style:font-name-asian="AR PL SungtiL GB" style:font-family-asian="&apos;AR PL SungtiL GB&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="14pt" style:font-name-complex="Lucida Sans" style:font-family-complex="&apos;Lucida Sans&apos;" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="Text_20_body" style:display-name="Text body" style:family="paragraph" style:parent-style-name="Standard" style:class="text">
+ <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0.247cm" loext:contextual-spacing="false" fo:line-height="115%"/>
+ </style:style>
+ <style:style style:name="List" style:family="paragraph" style:parent-style-name="Text_20_body" style:class="list">
+ <style:text-properties style:font-size-asian="12pt" style:font-name-complex="Lucida Sans1" style:font-family-complex="&apos;Lucida Sans&apos;" style:font-family-generic-complex="swiss"/>
+ </style:style>
+ <style:style style:name="Caption" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">
+ <style:paragraph-properties fo:margin-top="0.212cm" fo:margin-bottom="0.212cm" loext:contextual-spacing="false" text:number-lines="false" text:line-number="0"/>
+ <style:text-properties fo:font-size="12pt" fo:font-style="italic" style:font-size-asian="12pt" style:font-style-asian="italic" style:font-name-complex="Lucida Sans1" style:font-family-complex="&apos;Lucida Sans&apos;" style:font-family-generic-complex="swiss" style:font-size-complex="12pt" style:font-style-complex="italic"/>
+ </style:style>
+ <style:style style:name="Index" style:family="paragraph" style:parent-style-name="Standard" style:class="index">
+ <style:paragraph-properties text:number-lines="false" text:line-number="0"/>
+ <style:text-properties style:font-size-asian="12pt" style:font-name-complex="Lucida Sans1" style:font-family-complex="&apos;Lucida Sans&apos;" style:font-family-generic-complex="swiss"/>
+ </style:style>
+ <style:style style:name="Heading_20_1" style:display-name="Heading 1" style:family="paragraph" style:parent-style-name="Heading" style:next-style-name="Text_20_body" style:default-outline-level="1" style:class="text">
+ <style:paragraph-properties fo:margin-top="0.423cm" fo:margin-bottom="0.212cm" loext:contextual-spacing="false"/>
+ <style:text-properties fo:font-size="130%" fo:font-weight="bold" style:font-size-asian="130%" style:font-weight-asian="bold" style:font-size-complex="130%" style:font-weight-complex="bold"/>
+ </style:style>
+ </office:styles>
+ <office:automatic-styles>
+ <style:style style:name="P1" style:family="paragraph" style:parent-style-name="Standard">
+ <style:text-properties officeooo:paragraph-rsid="001f977c"/>
+ </style:style>
+ <style:style style:name="T1" style:family="text">
+ <style:text-properties officeooo:rsid="001f977c"/>
+ </style:style>
+ <style:page-layout style:name="pm1">
+ <style:page-layout-properties fo:page-width="10.5cm" fo:page-height="14.801cm" style:num-format="1" style:print-orientation="portrait" fo:margin-top="2cm" fo:margin-bottom="2cm" fo:margin-left="2cm" fo:margin-right="2cm" style:writing-mode="lr-tb" style:footnote-max-height="0cm">
+ <style:footnote-sep style:width="0.018cm" style:distance-before-sep="0.101cm" style:distance-after-sep="0.101cm" style:line-style="solid" style:adjustment="left" style:rel-width="25%" style:color="#000000"/>
+ </style:page-layout-properties>
+ <style:header-style/>
+ <style:footer-style/>
+ </style:page-layout>
+ </office:automatic-styles>
+ <office:master-styles>
+ <style:master-page style:name="Standard" style:page-layout-name="pm1"/>
+ </office:master-styles>
+ <office:body>
+ <office:text text:use-soft-page-breaks="true">
+ <text:h text:style-name="Heading_20_1" text:outline-level="1">First chapter</text:h>
+ <text:p text:style-name="P1"><text:span text:style-name="T1">He heard quiet steps behind him. That didn&apos;t bode well. Who could be following him this late at night and in this deadbeat part of town? And at this particular moment, just after he pulled off the big time and was making off with the greenbacks. Was there another crook who&apos;d had the same idea, and was now watching him and waiting for a chance to grab the fruit of his labor? Or did the steps behind him mean that one of many law officers in town was on to him and just waiting to pounce and snap those cuffs on his wrists? He nervously looked all around. Suddenly he saw the alley. Like lightning he darted off to the left and disappeared between the two warehouses almost falling over the trash can lying in the middle of the sidewalk. He tried to nervously tap </text:span><text:soft-page-break/><text:span text:style-name="T1">his way along in the inky darkness and suddenly stiffened: it was a dead-end, he would have to go back the way he had come. The steps got louder and louder, he saw the black outline of a figure coming around the corner. Is this the end of the line?</text:span></text:p>
+ <text:h text:style-name="Heading_20_1" text:outline-level="1">Second chapter</text:h>
+ <text:p text:style-name="Standard">This is the end.</text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/hello.fodt b/writerperfect/qa/unit/data/writer/epubexport/hello.fodt
new file mode 100644
index 000000000..b245e9d7a
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/hello.fodt
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document office:mimetype="application/vnd.oasis.opendocument.text" office:version="1.2" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">
+ <office:body>
+ <office:text>
+ <text:p><text:span>Hello world!</text:span></text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/image-border.fodt b/writerperfect/qa/unit/data/writer/epubexport/image-border.fodt
new file mode 100644
index 000000000..cffe4d606
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/image-border.fodt
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:styles>
+ <style:style style:name="Graphics" style:family="graphic">
+ <style:graphic-properties text:anchor-type="paragraph" svg:x="0cm" svg:y="0cm" style:wrap="dynamic" style:number-wrapped-paragraphs="no-limit" style:wrap-contour="false" style:vertical-pos="top" style:vertical-rel="paragraph" style:horizontal-pos="center" style:horizontal-rel="paragraph"/>
+ </style:style>
+ </office:styles>
+ <office:automatic-styles>
+ <style:style style:name="T1" style:family="text">
+ <style:text-properties fo:color="#000000" style:font-size-complex="12pt"/>
+ </style:style>
+ <style:style style:name="fr1" style:family="graphic" style:parent-style-name="Graphics">
+ <style:graphic-properties style:vertical-pos="top" style:vertical-rel="baseline" fo:padding="0.049cm" fo:border="0.99pt dashed #ed1c24" style:shadow="none" draw:shadow-opacity="100%" style:mirror="none" fo:clip="rect(0cm, 0cm, 0cm, 0cm)" draw:luminance="0%" draw:contrast="0%" draw:red="0%" draw:green="0%" draw:blue="0%" draw:gamma="100%" draw:color-inversion="false" draw:image-opacity="100%" draw:color-mode="standard"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:body>
+ <office:text>
+ <text:p text:style-name="Standard">before<text:span text:style-name="T1"><draw:frame draw:style-name="fr1" draw:name="Object0" text:anchor-type="as-char" svg:width="1.663cm" svg:height="1.663cm" draw:z-index="0"><draw:image loext:mime-type="image/png"><office:binary-data>iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAQAAAAAYLlVAAAABGdBTUEAALGPC/xhBQAAAAFz
+ UkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA
+ AAJiS0dEAACqjSMyAAAACW9GRnMAAAAGAAAAAAAMc1XTAAAACXBIWXMAAA3XAAAN1wFCKJt4
+ AAAACXZwQWcAAABMAAAAQACdMTgbAAABzUlEQVRo3u3ZPU/CQBjA8X+Jxs3ESUDj4iK+LA5+
+ BBfjqBE1cXB2MlFAEqMgxvhNNL4sLsK3UPQL6ObkoAETz+FKW2mxCPRYnucWUu76/OC59C49
+ cGOCKqrD9kHRc6ddPv7oW2WCwMh0nF63Myz7Tm8hPTNu0pgHMER3scepTbgK6enJNND83RLn
+ /878yRaPmgBZFDuMsNLeWB9gmFQHP77MIg9gsYciR50NFKvtjIy10yk84pSZA7DYpwR8scmF
+ QQCMuoQMpzbh0iAARrlnVn90CWHTsZcAiHPPdINQAuqsc2MQAAnKDUKWEhZ10twaBEDSJWQo
+ YlFj7S9CzwEegkXWIbQsRAQASFJhpplwbRAACS+hANRJBxMiAkDcJeQ4sQkBhYgMoJ+Ozlwo
+ 2YQ7AJ6CRxyiUGnVy3hVKb0Af9v7hUG2Wy9TEQCUelFTDULB2S+YKYGOMcpM6UIccOQnRA6A
+ cSp6ibfI+wkGADBGpTEd8xz1AaAfTQ7huA8AvUw5hVjuA0D/C5OaMN8XACRZ8F0zCggKAQhA
+ AAIQgAAEIAABCEAAAhCAAAQgAAH4zg3feY4w3Xs44M5+oW0qvCWoGcvaIlM3x/f/ab+O738A
+ hOCNQr34oD4AAAAldEVYdGNyZWF0ZS1kYXRlADIwMTAtMTItMjBUMTc6MDg6MzYrMDE6MDB6
+ 5RscAAAAJXRFWHRtb2RpZnktZGF0ZQAyMDEwLTEyLTIwVDE3OjA4OjM3KzAxOjAwgyNmnAAA
+ AABJRU5ErkJggg==
+ </office:binary-data></draw:image></draw:frame></text:span>after</text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/image-link.fodt b/writerperfect/qa/unit/data/writer/epubexport/image-link.fodt
new file mode 100644
index 000000000..0796cea3e
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/image-link.fodt
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:styles>
+ <style:style style:name="Standard" style:family="paragraph" style:class="text"/>
+ <style:style style:name="Graphics" style:family="graphic">
+ <style:graphic-properties text:anchor-type="paragraph" svg:x="0cm" svg:y="0cm" style:wrap="dynamic" style:number-wrapped-paragraphs="no-limit" style:wrap-contour="false" style:vertical-pos="top" style:vertical-rel="paragraph" style:horizontal-pos="center" style:horizontal-rel="paragraph"/>
+ </style:style>
+ </office:styles>
+ <office:automatic-styles>
+ <style:style style:name="fr1" style:family="graphic" style:parent-style-name="Graphics">
+ <style:graphic-properties style:vertical-pos="top" style:vertical-rel="baseline" style:horizontal-pos="center" style:horizontal-rel="paragraph" style:shadow="none" draw:shadow-opacity="100%" style:mirror="none" fo:clip="rect(0cm, 0cm, 0cm, 0cm)" draw:luminance="0%" draw:contrast="0%" draw:red="0%" draw:green="0%" draw:blue="0%" draw:gamma="100%" draw:color-inversion="false" draw:image-opacity="100%" draw:color-mode="standard"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:master-styles>
+ <style:master-page style:name="Standard" style:page-layout-name="pm1"/>
+ </office:master-styles>
+ <office:body>
+ <office:text>
+ <text:p text:style-name="Standard"><draw:a xlink:type="simple" xlink:href="http://libreoffice.org/"><draw:frame draw:style-name="fr1" draw:name="Image1" text:anchor-type="as-char" svg:width="1.806cm" svg:height="1.806cm" draw:z-index="0"><draw:image loext:mime-type="image/png"><office:binary-data>iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAQAAAAAYLlVAAAABGdBTUEAALGPC/xhBQAAAAFz
+ UkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA
+ AAJiS0dEAACqjSMyAAAACW9GRnMAAAAGAAAAAAAMc1XTAAAACXBIWXMAAA3XAAAN1wFCKJt4
+ AAAACXZwQWcAAABMAAAAQACdMTgbAAABzUlEQVRo3u3ZPU/CQBjA8X+Jxs3ESUDj4iK+LA5+
+ BBfjqBE1cXB2MlFAEqMgxvhNNL4sLsK3UPQL6ObkoAETz+FKW2mxCPRYnucWUu76/OC59C49
+ cGOCKqrD9kHRc6ddPv7oW2WCwMh0nF63Myz7Tm8hPTNu0pgHMER3scepTbgK6enJNND83RLn
+ /878yRaPmgBZFDuMsNLeWB9gmFQHP77MIg9gsYciR50NFKvtjIy10yk84pSZA7DYpwR8scmF
+ QQCMuoQMpzbh0iAARrlnVn90CWHTsZcAiHPPdINQAuqsc2MQAAnKDUKWEhZ10twaBEDSJWQo
+ YlFj7S9CzwEegkXWIbQsRAQASFJhpplwbRAACS+hANRJBxMiAkDcJeQ4sQkBhYgMoJ+Ozlwo
+ 2YQ7AJ6CRxyiUGnVy3hVKb0Af9v7hUG2Wy9TEQCUelFTDULB2S+YKYGOMcpM6UIccOQnRA6A
+ cSp6ibfI+wkGADBGpTEd8xz1AaAfTQ7huA8AvUw5hVjuA0D/C5OaMN8XACRZ8F0zCggKAQhA
+ AAIQgAAEIAABCEAAAhCAAAQgAAH4zg3feY4w3Xs44M5+oW0qvCWoGcvaIlM3x/f/ab+O738A
+ hOCNQr34oD4AAAAldEVYdGNyZWF0ZS1kYXRlADIwMTAtMTItMjBUMTc6MDg6MzYrMDE6MDB6
+ 5RscAAAAJXRFWHRtb2RpZnktZGF0ZQAyMDEwLTEyLTIwVDE3OjA4OjM3KzAxOjAwgyNmnAAA
+ AABJRU5ErkJggg==
+ </office:binary-data></draw:image></draw:frame></draw:a></text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/image-nospan.fodt b/writerperfect/qa/unit/data/writer/epubexport/image-nospan.fodt
new file mode 100644
index 000000000..332052a9e
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/image-nospan.fodt
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:styles>
+ <style:style style:name="Graphics" style:family="graphic">
+ <style:graphic-properties text:anchor-type="paragraph" svg:x="0cm" svg:y="0cm" style:wrap="dynamic" style:number-wrapped-paragraphs="no-limit" style:wrap-contour="false" style:vertical-pos="top" style:vertical-rel="paragraph" style:horizontal-pos="center" style:horizontal-rel="paragraph"/>
+ </style:style>
+ </office:styles>
+ <office:automatic-styles>
+ <style:style style:name="fr1" style:family="graphic" style:parent-style-name="Graphics">
+ <style:graphic-properties style:vertical-pos="top" style:vertical-rel="baseline" fo:padding="0.049cm" fo:border="0.99pt dashed #ed1c24" style:shadow="none" draw:shadow-opacity="100%" style:mirror="none" fo:clip="rect(0cm, 0cm, 0cm, 0cm)" draw:luminance="0%" draw:contrast="0%" draw:red="0%" draw:green="0%" draw:blue="0%" draw:gamma="100%" draw:color-inversion="false" draw:image-opacity="100%" draw:color-mode="standard"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:body>
+ <office:text>
+ <text:p text:style-name="Standard">before<draw:frame draw:style-name="fr1" draw:name="Object0" text:anchor-type="as-char" svg:width="1.663cm" svg:height="1.663cm" draw:z-index="0"><draw:image loext:mime-type="image/png"><office:binary-data>iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAQAAAAAYLlVAAAABGdBTUEAALGPC/xhBQAAAAFz
+ UkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA
+ AAJiS0dEAACqjSMyAAAACW9GRnMAAAAGAAAAAAAMc1XTAAAACXBIWXMAAA3XAAAN1wFCKJt4
+ AAAACXZwQWcAAABMAAAAQACdMTgbAAABzUlEQVRo3u3ZPU/CQBjA8X+Jxs3ESUDj4iK+LA5+
+ BBfjqBE1cXB2MlFAEqMgxvhNNL4sLsK3UPQL6ObkoAETz+FKW2mxCPRYnucWUu76/OC59C49
+ cGOCKqrD9kHRc6ddPv7oW2WCwMh0nF63Myz7Tm8hPTNu0pgHMER3scepTbgK6enJNND83RLn
+ /878yRaPmgBZFDuMsNLeWB9gmFQHP77MIg9gsYciR50NFKvtjIy10yk84pSZA7DYpwR8scmF
+ QQCMuoQMpzbh0iAARrlnVn90CWHTsZcAiHPPdINQAuqsc2MQAAnKDUKWEhZ10twaBEDSJWQo
+ YlFj7S9CzwEegkXWIbQsRAQASFJhpplwbRAACS+hANRJBxMiAkDcJeQ4sQkBhYgMoJ+Ozlwo
+ 2YQ7AJ6CRxyiUGnVy3hVKb0Af9v7hUG2Wy9TEQCUelFTDULB2S+YKYGOMcpM6UIccOQnRA6A
+ cSp6ibfI+wkGADBGpTEd8xz1AaAfTQ7huA8AvUw5hVjuA0D/C5OaMN8XACRZ8F0zCggKAQhA
+ AAIQgAAEIAABCEAAAhCAAAQgAAH4zg3feY4w3Xs44M5+oW0qvCWoGcvaIlM3x/f/ab+O738A
+ hOCNQr34oD4AAAAldEVYdGNyZWF0ZS1kYXRlADIwMTAtMTItMjBUMTc6MDg6MzYrMDE6MDB6
+ 5RscAAAAJXRFWHRtb2RpZnktZGF0ZQAyMDEwLTEyLTIwVDE3OjA4OjM3KzAxOjAwgyNmnAAA
+ AABJRU5ErkJggg==
+ </office:binary-data></draw:image></draw:frame>after</text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/image.fodt b/writerperfect/qa/unit/data/writer/epubexport/image.fodt
new file mode 100644
index 000000000..52e6d2b97
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/image.fodt
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:automatic-styles>
+ <style:style style:name="T1" style:family="text">
+ <style:text-properties fo:color="#000000" style:font-size-complex="12pt"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:body>
+ <office:text>
+ <text:p>before<text:span text:style-name="T1"><draw:frame draw:name="Object0" text:anchor-type="as-char" svg:y="0cm" svg:width="1.663cm" svg:height="1.663cm" draw:z-index="0"><draw:image loext:mime-type="image/png"><office:binary-data>iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAQAAAAAYLlVAAAABGdBTUEAALGPC/xhBQAAAAFz
+ UkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA
+ AAJiS0dEAACqjSMyAAAACW9GRnMAAAAGAAAAAAAMc1XTAAAACXBIWXMAAA3XAAAN1wFCKJt4
+ AAAACXZwQWcAAABMAAAAQACdMTgbAAABzUlEQVRo3u3ZPU/CQBjA8X+Jxs3ESUDj4iK+LA5+
+ BBfjqBE1cXB2MlFAEqMgxvhNNL4sLsK3UPQL6ObkoAETz+FKW2mxCPRYnucWUu76/OC59C49
+ cGOCKqrD9kHRc6ddPv7oW2WCwMh0nF63Myz7Tm8hPTNu0pgHMER3scepTbgK6enJNND83RLn
+ /878yRaPmgBZFDuMsNLeWB9gmFQHP77MIg9gsYciR50NFKvtjIy10yk84pSZA7DYpwR8scmF
+ QQCMuoQMpzbh0iAARrlnVn90CWHTsZcAiHPPdINQAuqsc2MQAAnKDUKWEhZ10twaBEDSJWQo
+ YlFj7S9CzwEegkXWIbQsRAQASFJhpplwbRAACS+hANRJBxMiAkDcJeQ4sQkBhYgMoJ+Ozlwo
+ 2YQ7AJ6CRxyiUGnVy3hVKb0Af9v7hUG2Wy9TEQCUelFTDULB2S+YKYGOMcpM6UIccOQnRA6A
+ cSp6ibfI+wkGADBGpTEd8xz1AaAfTQ7huA8AvUw5hVjuA0D/C5OaMN8XACRZ8F0zCggKAQhA
+ AAIQgAAEIAABCEAAAhCAAAQgAAH4zg3feY4w3Xs44M5+oW0qvCWoGcvaIlM3x/f/ab+O738A
+ hOCNQr34oD4AAAAldEVYdGNyZWF0ZS1kYXRlADIwMTAtMTItMjBUMTc6MDg6MzYrMDE6MDB6
+ 5RscAAAAJXRFWHRtb2RpZnktZGF0ZQAyMDEwLTEyLTIwVDE3OjA4OjM3KzAxOjAwgyNmnAAA
+ AABJRU5ErkJggg==
+ </office:binary-data></draw:image></draw:frame></text:span>after</text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/line-break.fodt b/writerperfect/qa/unit/data/writer/epubexport/line-break.fodt
new file mode 100644
index 000000000..1a6fca72b
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/line-break.fodt
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:officeooo="http://openoffice.org/2009/office" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:automatic-styles>
+ <style:style style:name="T1" style:family="text">
+ <style:text-properties officeooo:rsid="000075b1"/>
+ </style:style>
+ <style:style style:name="T2" style:family="text">
+ <style:text-properties fo:font-weight="bold"/>
+ </style:style>
+ <style:style style:name="T3" style:family="text">
+ <style:text-properties fo:font-weight="bold" officeooo:rsid="000075b1"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:body>
+ <office:text>
+ <text:p>a<text:line-break/>b</text:p>
+ <text:p><text:span text:style-name="T1">a</text:span><text:span text:style-name="T2">a<text:line-break/></text:span><text:span text:style-name="T3">b</text:span>b</text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/link-charformat.fodt b/writerperfect/qa/unit/data/writer/epubexport/link-charformat.fodt
new file mode 100644
index 000000000..b158ce3db
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/link-charformat.fodt
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:automatic-styles>
+ <style:style style:name="T1" style:family="text">
+ <style:text-properties fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:body>
+ <office:text>
+ <text:p>Before <text:a xlink:type="simple" xlink:href="https://libreoffice.org/"><text:span text:style-name="T1">https://libreoffice.org/</text:span></text:a> after.</text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/link-invalid.odt b/writerperfect/qa/unit/data/writer/epubexport/link-invalid.odt
new file mode 100644
index 000000000..3bbbdeb92
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/link-invalid.odt
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/epubexport/link-namedcharformat.fodt b/writerperfect/qa/unit/data/writer/epubexport/link-namedcharformat.fodt
new file mode 100644
index 000000000..0e05c8d74
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/link-namedcharformat.fodt
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:styles>
+ <style:style style:name="Internet_20_link" style:display-name="Internet link" style:family="text">
+ <style:text-properties fo:color="#ff0000" fo:language="zxx" fo:country="none" style:text-underline-style="solid" style:text-underline-width="auto" style:text-underline-color="font-color" style:language-asian="zxx" style:country-asian="none" style:language-complex="zxx" style:country-complex="none"/>
+ </style:style>
+ </office:styles>
+ <office:body>
+ <office:text>
+ <text:p text:style-name="P1">A <text:a xlink:type="simple" xlink:href="http://libreoffice.org/" text:style-name="Internet_20_link" text:visited-style-name="Visited_20_Internet_20_Link">http://libreoffice.org</text:a> b – red via character style</text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/link.fodt b/writerperfect/qa/unit/data/writer/epubexport/link.fodt
new file mode 100644
index 000000000..9a2efcc0b
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/link.fodt
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:body>
+ <office:text>
+ <text:p>Before <text:a xlink:type="simple" xlink:href="https://libreoffice.org/">https://libreoffice.org/</text:a> after.</text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/list.fodt b/writerperfect/qa/unit/data/writer/epubexport/list.fodt
new file mode 100644
index 000000000..9c02b9d09
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/list.fodt
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:automatic-styles>
+ <style:style style:name="P1" style:family="paragraph" style:list-style-name="L1"/>
+ <text:list-style style:name="L1">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="•">
+ <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+ <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.27cm" fo:text-indent="-0.635cm" fo:margin-left="1.27cm"/>
+ </style:list-level-properties>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </office:automatic-styles>
+ <office:body>
+ <office:text>
+ <text:p>A</text:p>
+ <text:list xml:id="list1647378619" text:style-name="L1">
+ <text:list-item>
+ <text:p text:style-name="P1">B</text:p>
+ </text:list-item>
+ </text:list>
+ <text:p>C</text:p>
+ <text:p>D</text:p>
+ <text:list xml:id="list111055674" text:style-name="L1">
+ <text:list-item>
+ <text:p text:style-name="P1">E</text:p>
+ <text:list>
+ <text:list-item>
+ <text:p text:style-name="P1">F</text:p>
+ </text:list-item>
+ </text:list>
+ </text:list-item>
+ </text:list>
+ <text:p>G</text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/meta-xmp.fodt b/writerperfect/qa/unit/data/writer/epubexport/meta-xmp.fodt
new file mode 100644
index 000000000..9287ecb25
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/meta-xmp.fodt
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:meta>
+ <meta:initial-creator>unknown author from doc</meta:initial-creator>
+ <dc:title>unknown title from doc</dc:title>
+ <dc:language>de</dc:language>
+ <dc:date>2014-09-27T09:51:19.243117081</dc:date>
+ </office:meta>
+ <office:body>
+ <office:text>
+ <text:p><text:span>Hello world!</text:span></text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/meta-xmp/metadata.xmp b/writerperfect/qa/unit/data/writer/epubexport/meta-xmp/metadata.xmp
new file mode 100644
index 000000000..aa578159c
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/meta-xmp/metadata.xmp
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/">
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <dc:identifier>deadbeef-e394-4cd6-9b83-7172794612e5</dc:identifier>
+ <dc:title>
+ <rdf:Alt>
+ <rdf:li>unknown title from xmp</rdf:li>
+ </rdf:Alt>
+ </dc:title>
+ <dc:creator>
+ <rdf:Seq>
+ <rdf:li>unknown author from xmp</rdf:li>
+ </rdf:Seq>
+ </dc:creator>
+ <dc:language>
+ <rdf:Bag>
+ <rdf:li>nl</rdf:li>
+ </rdf:Bag>
+ </dc:language>
+ <dc:date>
+ <rdf:Seq>
+ <rdf:li>2016-11-20T17:16:07Z</rdf:li>
+ </rdf:Seq>
+ </dc:date>
+ </rdf:Description>
+ </rdf:RDF>
+</x:xmpmeta>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/meta.fodt b/writerperfect/qa/unit/data/writer/epubexport/meta.fodt
new file mode 100644
index 000000000..8b1af3e44
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/meta.fodt
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document office:mimetype="application/vnd.oasis.opendocument.text" office:version="1.2" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <office:meta>
+ <meta:initial-creator>A U Thor</meta:initial-creator>
+ <dc:title>Title</dc:title>
+ <dc:language>hu</dc:language>
+ <dc:date>2017-09-27T09:51:19.243117081</dc:date>
+ </office:meta>
+ <office:body>
+ <office:text>
+ <text:p><text:span>Hello world!</text:span></text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/meta/cover.png b/writerperfect/qa/unit/data/writer/epubexport/meta/cover.png
new file mode 100644
index 000000000..fdad35484
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/meta/cover.png
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/epubexport/named-style-inheritance.fodt b/writerperfect/qa/unit/data/writer/epubexport/named-style-inheritance.fodt
new file mode 100644
index 000000000..2bd619777
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/named-style-inheritance.fodt
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:font-face-decls>
+ <style:font-face style:name="Liberation Mono" svg:font-family="&apos;Liberation Mono&apos;" style:font-family-generic="modern" style:font-pitch="fixed"/>
+ <style:font-face style:name="Liberation Serif" svg:font-family="&apos;Liberation Serif&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+ <style:font-face style:name="Liberation Sans" svg:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="swiss" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:styles>
+ <style:style style:name="Heading" style:family="paragraph" style:class="text">
+ <style:paragraph-properties fo:margin-top="0.423cm" fo:margin-bottom="0.212cm" fo:keep-with-next="always"/>
+ <style:text-properties style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="14pt"/>
+ </style:style>
+ <style:style style:name="Heading_20_1" style:display-name="Heading 1" style:family="paragraph" style:parent-style-name="Heading" style:default-outline-level="1" style:class="text">
+ </style:style>
+ <style:style style:name="Blue_20_Source_20_Text" style:display-name="Blue Source Text" style:family="text" style:parent-style-name="Source_20_Text">
+ <style:text-properties fo:color="#0000ff"/>
+ </style:style>
+ <style:style style:name="Source_20_Text" style:display-name="Source Text" style:family="text">
+ <style:text-properties style:font-name="Liberation Mono" fo:font-family="&apos;Liberation Mono&apos;" style:font-family-generic="modern" style:font-pitch="fixed"/>
+ </style:style>
+ </office:styles>
+ <office:automatic-styles>
+ <style:page-layout style:name="pm1">
+ <style:page-layout-properties fo:page-width="21.59cm" fo:page-height="27.94cm">
+ </style:page-layout-properties>
+ <style:header-style/>
+ <style:footer-style/>
+ </style:page-layout>
+ </office:automatic-styles>
+ <office:master-styles>
+ <style:master-page style:name="Standard" style:page-layout-name="pm1"/>
+ </office:master-styles>
+ <office:body>
+ <office:text>
+ <text:h text:style-name="Heading_20_1" text:outline-level="1">Heading 1</text:h>
+ <text:p>Text Body<text:span text:style-name="Blue_20_Source_20_Text">blue</text:span></text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/nested-span.fodt b/writerperfect/qa/unit/data/writer/epubexport/nested-span.fodt
new file mode 100644
index 000000000..a593ff348
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/nested-span.fodt
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:font-face-decls>
+ <style:font-face style:name="Liberation Mono" svg:font-family="&apos;Liberation Mono&apos;" style:font-family-generic="modern" style:font-pitch="fixed"/>
+ </office:font-face-decls>
+ <office:styles>
+ <style:style style:name="Source_20_Text" style:display-name="Source Text" style:family="text">
+ <style:text-properties style:font-name="Liberation Mono" fo:font-family="&apos;Liberation Mono&apos;" style:font-family-generic="modern" style:font-pitch="fixed"/>
+ </style:style>
+ </office:styles>
+ <office:automatic-styles>
+ <style:style style:name="T1" style:family="text">
+ <style:text-properties fo:color="#ff0000"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:body>
+ <office:text>
+ <text:p>before<text:span text:style-name="Source_20_Text"><text:span text:style-name="T1">red</text:span></text:span></text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/outline-level.fodt b/writerperfect/qa/unit/data/writer/epubexport/outline-level.fodt
new file mode 100644
index 000000000..11cbf3dc2
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/outline-level.fodt
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document office:mimetype="application/vnd.oasis.opendocument.text" office:version="1.2" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">
+ <office:body>
+ <office:text>
+ <text:h text:outline-level="1">Chapter 1</text:h>
+ <text:p>foo</text:p>
+ <text:h text:outline-level="2">Chapter 1.1</text:h>
+ <text:p>foo</text:p>
+ <text:h text:outline-level="1">Chapter 2</text:h>
+ <text:p>bar</text:p>
+ <text:h text:outline-level="2">Chapter 2.1</text:h>
+ <text:p>bar</text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/para-autostyle-char-props.fodt b/writerperfect/qa/unit/data/writer/epubexport/para-autostyle-char-props.fodt
new file mode 100644
index 000000000..ceb556940
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/para-autostyle-char-props.fodt
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:font-face-decls>
+ <style:font-face style:name="Liberation Serif" svg:font-family="&apos;Liberation Serif&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+ <style:font-face style:name="Liberation Sans" svg:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="swiss" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:automatic-styles>
+ <style:style style:name="P1" style:family="paragraph">
+ <style:text-properties style:font-name="Liberation Serif"/>
+ </style:style>
+ <style:style style:name="P2" style:family="paragraph">
+ <style:text-properties style:font-name="Liberation Sans"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:body>
+ <office:text>
+ <text:p text:style-name="P1">This is serif.</text:p>
+ <text:p text:style-name="P2">This is sans.</text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/para-char-props.fodt b/writerperfect/qa/unit/data/writer/epubexport/para-char-props.fodt
new file mode 100644
index 000000000..67fe02db2
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/para-char-props.fodt
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:automatic-styles>
+ <style:style style:name="P1" style:family="paragraph">
+ <style:text-properties fo:font-weight="bold" />
+ </style:style>
+ <style:style style:name="T1" style:family="text">
+ <style:text-properties fo:font-style="italic"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:body>
+ <office:text>
+ <text:p text:style-name="P1">a<text:span text:style-name="T1">b</text:span>c</text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/para-namedstyle.fodt b/writerperfect/qa/unit/data/writer/epubexport/para-namedstyle.fodt
new file mode 100644
index 000000000..887a5c1b2
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/para-namedstyle.fodt
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:font-face-decls>
+ <style:font-face style:name="Liberation Sans" svg:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="swiss" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:styles>
+ <style:style style:name="Heading" style:family="paragraph" style:class="text">
+ <style:paragraph-properties fo:margin-top="0.423cm" fo:margin-bottom="0.212cm" fo:keep-with-next="always"/>
+ <style:text-properties style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="14pt"/>
+ </style:style>
+ </office:styles>
+ <office:body>
+ <office:text>
+ <text:h text:style-name="Heading" text:outline-level="1">Heading</text:h>
+ <text:p>Text Body</text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/popup-api.odt b/writerperfect/qa/unit/data/writer/epubexport/popup-api.odt
new file mode 100644
index 000000000..30f4cc8f5
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/popup-api.odt
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/epubexport/popup-media.odt b/writerperfect/qa/unit/data/writer/epubexport/popup-media.odt
new file mode 100644
index 000000000..5f45e7ce8
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/popup-media.odt
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/epubexport/popup-media/libreoffice.png b/writerperfect/qa/unit/data/writer/epubexport/popup-media/libreoffice.png
new file mode 100644
index 000000000..cc74f136f
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/popup-media/libreoffice.png
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/epubexport/popup.odt b/writerperfect/qa/unit/data/writer/epubexport/popup.odt
new file mode 100644
index 000000000..30f4cc8f5
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/popup.odt
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/epubexport/popup/libreoffice.png b/writerperfect/qa/unit/data/writer/epubexport/popup/libreoffice.png
new file mode 100644
index 000000000..cc74f136f
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/popup/libreoffice.png
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/epubexport/section.fodt b/writerperfect/qa/unit/data/writer/epubexport/section.fodt
new file mode 100644
index 000000000..84fb6d2ae
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/section.fodt
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:body>
+ <office:text>
+ <text:p>Before.</text:p>
+ <text:section text:name="Section1">
+ <text:p>In section.</text:p>
+ </text:section>
+ <text:p>After.</text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/simple-ruby.odt b/writerperfect/qa/unit/data/writer/epubexport/simple-ruby.odt
new file mode 100644
index 000000000..160dd00ee
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/simple-ruby.odt
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/epubexport/span-autostyle.fodt b/writerperfect/qa/unit/data/writer/epubexport/span-autostyle.fodt
new file mode 100644
index 000000000..3122bef8d
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/span-autostyle.fodt
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:automatic-styles>
+ <style:style style:name="T1" style:family="text">
+ <style:text-properties fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/>
+ </style:style>
+ <style:style style:name="T2" style:family="text">
+ <style:text-properties fo:font-style="italic" style:font-style-asian="italic" style:font-style-complex="italic"/>
+ </style:style>
+ <style:style style:name="T3" style:family="text">
+ <style:text-properties style:text-underline-style="solid" style:text-underline-width="auto" style:text-underline-color="font-color"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:body>
+ <office:text>
+ <text:p text:style-name="Standard"><text:span text:style-name="T1">Hello</text:span> <text:span text:style-name="T2">world</text:span><text:span text:style-name="T3">!</text:span></text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/table-cell-border.fodt b/writerperfect/qa/unit/data/writer/epubexport/table-cell-border.fodt
new file mode 100644
index 000000000..28beff5ef
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/table-cell-border.fodt
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:automatic-styles>
+ <style:style style:name="Table1" style:family="table">
+ <style:table-properties style:width="17.59cm" table:align="margins"/>
+ </style:style>
+ <style:style style:name="Table1.A" style:family="table-column">
+ <style:table-column-properties style:column-width="8.795cm" style:rel-column-width="32767*"/>
+ </style:style>
+ <style:style style:name="Table1.A1" style:family="table-cell">
+ <style:table-cell-properties fo:padding="0.097cm" fo:border-left="0.05pt solid #000000" fo:border-right="none" fo:border-top="0.05pt solid #000000" fo:border-bottom="0.05pt solid #000000"/>
+ </style:style>
+ <style:style style:name="Table1.B1" style:family="table-cell">
+ <style:table-cell-properties fo:padding="0.097cm" fo:border="0.05pt solid #000000"/>
+ </style:style>
+ <style:style style:name="Table1.A2" style:family="table-cell">
+ <style:table-cell-properties fo:padding="0.097cm" fo:border-left="0.05pt solid #000000" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/>
+ </style:style>
+ <style:style style:name="Table1.B2" style:family="table-cell">
+ <style:table-cell-properties fo:padding="0.097cm" fo:border-left="0.05pt solid #000000" fo:border-right="0.05pt solid #000000" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:body>
+ <office:text>
+ <text:p>Before</text:p>
+ <table:table table:name="Table1" table:style-name="Table1">
+ <table:table-column table:style-name="Table1.A" table:number-columns-repeated="2"/>
+ <table:table-row>
+ <table:table-cell table:style-name="Table1.A1" office:value-type="string">
+ <text:p>A1</text:p>
+ </table:table-cell>
+ <table:table-cell table:style-name="Table1.B1" office:value-type="string">
+ <text:p>B1</text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row>
+ <table:table-cell table:style-name="Table1.A2" office:value-type="string">
+ <text:p>A2</text:p>
+ </table:table-cell>
+ <table:table-cell table:style-name="Table1.B2" office:value-type="string">
+ <text:p>B2</text:p>
+ </table:table-cell>
+ </table:table-row>
+ </table:table>
+ <text:p>After</text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/table-cell-width.fodt b/writerperfect/qa/unit/data/writer/epubexport/table-cell-width.fodt
new file mode 100644
index 000000000..345550928
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/table-cell-width.fodt
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:automatic-styles>
+ <style:style style:name="Table1" style:family="table">
+ <style:table-properties style:width="17.59cm" table:align="margins" style:shadow="none"/>
+ </style:style>
+ <style:style style:name="Table1.A" style:family="table-column">
+ <style:table-column-properties style:column-width="8.999cm" style:rel-column-width="5102*"/>
+ </style:style>
+ <style:style style:name="Table1.B" style:family="table-column">
+ <style:table-column-properties style:column-width="4.191cm" style:rel-column-width="2376*"/>
+ </style:style>
+ <style:style style:name="Table1.C" style:family="table-column">
+ <style:table-column-properties style:column-width="4.399cm" style:rel-column-width="2494*"/>
+ </style:style>
+ <style:style style:name="Table1.A1" style:family="table-cell">
+ <style:table-cell-properties fo:padding="0.097cm" fo:border-left="1pt solid #000000" fo:border-right="none" fo:border-top="1pt solid #000000" fo:border-bottom="1pt solid #000000"/>
+ </style:style>
+ <style:style style:name="Table1.C1" style:family="table-cell">
+ <style:table-cell-properties fo:padding="0.097cm" fo:border="1pt solid #000000"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:body>
+ <office:text>
+ <text:p>Before</text:p>
+ <table:table table:name="Table1" table:style-name="Table1">
+ <table:table-column table:style-name="Table1.A"/>
+ <table:table-column table:style-name="Table1.B"/>
+ <table:table-column table:style-name="Table1.C"/>
+ <table:table-row>
+ <table:table-cell table:style-name="Table1.A1" office:value-type="string">
+ <text:p>A1, this is wider</text:p>
+ </table:table-cell>
+ <table:table-cell table:style-name="Table1.A1" office:value-type="string">
+ <text:p>B1, than this</text:p>
+ </table:table-cell>
+ <table:table-cell table:style-name="Table1.C1" office:value-type="string">
+ <text:p>C1, or this</text:p>
+ </table:table-cell>
+ </table:table-row>
+ </table:table>
+ <text:p>After</text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/table-row-height.fodt b/writerperfect/qa/unit/data/writer/epubexport/table-row-height.fodt
new file mode 100644
index 000000000..28b06a429
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/table-row-height.fodt
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:automatic-styles>
+ <style:style style:name="Table1" style:family="table">
+ <style:table-properties style:width="17.59cm" table:align="margins"/>
+ </style:style>
+ <style:style style:name="Table1.A" style:family="table-column">
+ <style:table-column-properties style:column-width="17.59cm" style:rel-column-width="65535*"/>
+ </style:style>
+ <style:style style:name="Table1.1" style:family="table-row">
+ <style:table-row-properties style:row-height="2cm"/>
+ </style:style>
+ <style:style style:name="Table1.A1" style:family="table-cell">
+ <style:table-cell-properties fo:padding="0.097cm" fo:border="0.05pt solid #000000"/>
+ </style:style>
+ <style:style style:name="Table1.2" style:family="table-row">
+ <style:table-row-properties style:row-height="1cm"/>
+ </style:style>
+ <style:style style:name="Table1.A2" style:family="table-cell">
+ <style:table-cell-properties fo:padding="0.097cm" fo:border-left="0.05pt solid #000000" fo:border-right="0.05pt solid #000000" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:body>
+ <office:text>
+ <text:p>Before</text:p>
+ <table:table table:name="Table1" table:style-name="Table1">
+ <table:table-column table:style-name="Table1.A"/>
+ <table:table-row table:style-name="Table1.1">
+ <table:table-cell table:style-name="Table1.A1" office:value-type="string">
+ <text:p>This row has a larger height</text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="Table1.2">
+ <table:table-cell table:style-name="Table1.A2" office:value-type="string">
+ <text:p>Than this one.</text:p>
+ </table:table-cell>
+ </table:table-row>
+ </table:table>
+ <text:p>After</text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/table-row-span.fodt b/writerperfect/qa/unit/data/writer/epubexport/table-row-span.fodt
new file mode 100644
index 000000000..dd007dcc1
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/table-row-span.fodt
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:automatic-styles>
+ <style:style style:name="Table1" style:family="table">
+ <style:table-properties style:width="17.59cm" table:align="margins"/>
+ </style:style>
+ <style:style style:name="Table1.A" style:family="table-column">
+ <style:table-column-properties style:column-width="8.795cm" style:rel-column-width="32767*"/>
+ </style:style>
+ <style:style style:name="Table1.A1" style:family="table-cell">
+ <style:table-cell-properties fo:padding="0.097cm" fo:border-left="0.05pt solid #000000" fo:border-right="none" fo:border-top="0.05pt solid #000000" fo:border-bottom="0.05pt solid #000000"/>
+ </style:style>
+ <style:style style:name="Table1.B1" style:family="table-cell">
+ <style:table-cell-properties fo:padding="0.097cm" fo:border="0.05pt solid #000000"/>
+ </style:style>
+ <style:style style:name="Table1.B2" style:family="table-cell">
+ <style:table-cell-properties fo:padding="0.097cm" fo:border-left="0.05pt solid #000000" fo:border-right="0.05pt solid #000000" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:body>
+ <office:text>
+ <table:table table:name="Table1" table:style-name="Table1">
+ <table:table-column table:style-name="Table1.A" table:number-columns-repeated="2"/>
+ <table:table-row>
+ <table:table-cell table:style-name="Table1.A1" table:number-rows-spanned="2" office:value-type="string">
+ <text:p>Row spanning</text:p>
+ </table:table-cell>
+ <table:table-cell table:style-name="Table1.B1" office:value-type="string">
+ <text:p>B1</text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row>
+ <table:covered-table-cell/>
+ <table:table-cell table:style-name="Table1.B2" office:value-type="string">
+ <text:p>B2</text:p>
+ </table:table-cell>
+ </table:table-row>
+ </table:table>
+ <text:p/>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/table-width.fodt b/writerperfect/qa/unit/data/writer/epubexport/table-width.fodt
new file mode 100644
index 000000000..17793628d
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/table-width.fodt
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:automatic-styles>
+ <style:style style:name="Table1" style:family="table">
+ <style:table-properties style:width="8.795cm" style:rel-width="50%" table:align="left"/>
+ </style:style>
+ <style:style style:name="Table1.A" style:family="table-column">
+ <style:table-column-properties style:column-width="8.795cm" style:rel-column-width="4986*"/>
+ </style:style>
+ <style:style style:name="Table1.A1" style:family="table-cell">
+ <style:table-cell-properties fo:padding="0.097cm" fo:border="0.05pt solid #000000"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:body>
+ <office:text>
+ <text:p>Before</text:p>
+ <table:table table:name="Table1" table:style-name="Table1">
+ <table:table-column table:style-name="Table1.A"/>
+ <table:table-row>
+ <table:table-cell table:style-name="Table1.A1" office:value-type="string">
+ <text:p>In table</text:p>
+ </table:table-cell>
+ </table:table-row>
+ </table:table>
+ <text:p>After</text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/table.fodt b/writerperfect/qa/unit/data/writer/epubexport/table.fodt
new file mode 100644
index 000000000..9135c902f
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/table.fodt
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:automatic-styles>
+ <style:style style:name="Table1" style:family="table">
+ <style:table-properties style:width="17.59cm" table:align="margins"/>
+ </style:style>
+ <style:style style:name="Table1.A" style:family="table-column">
+ <style:table-column-properties style:column-width="8.795cm" style:rel-column-width="32767*"/>
+ </style:style>
+ <style:style style:name="Table1.A1" style:family="table-cell">
+ <style:table-cell-properties fo:padding="0.097cm"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:body>
+ <office:text>
+ <text:p>Before</text:p>
+ <table:table table:name="Table1" table:style-name="Table1">
+ <table:table-column table:style-name="Table1.A" table:number-columns-repeated="2"/>
+ <table:table-row>
+ <table:table-cell table:style-name="Table1.A1" office:value-type="string">
+ <text:p>A1</text:p>
+ </table:table-cell>
+ <table:table-cell table:style-name="Table1.A1" office:value-type="string">
+ <text:p>B1</text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row>
+ <table:table-cell table:style-name="Table1.A1" office:value-type="string">
+ <text:p>A2</text:p>
+ </table:table-cell>
+ <table:table-cell table:style-name="Table1.A1" office:value-type="string">
+ <text:p>B2</text:p>
+ </table:table-cell>
+ </table:table-row>
+ </table:table>
+ <text:p>After</text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/epubexport/tdf115623-many-pagespans.odt b/writerperfect/qa/unit/data/writer/epubexport/tdf115623-many-pagespans.odt
new file mode 100644
index 000000000..3e7c291aa
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/tdf115623-many-pagespans.odt
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/epubexport/tdf115623-single-writing-mode.odt b/writerperfect/qa/unit/data/writer/epubexport/tdf115623-single-writing-mode.odt
new file mode 100644
index 000000000..4c374a1bd
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/tdf115623-single-writing-mode.odt
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/epubexport/tdf115623-split-by-chapter.odt b/writerperfect/qa/unit/data/writer/epubexport/tdf115623-split-by-chapter.odt
new file mode 100644
index 000000000..ee6d48296
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/tdf115623-split-by-chapter.odt
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/epubexport/text-box.fodt b/writerperfect/qa/unit/data/writer/epubexport/text-box.fodt
new file mode 100644
index 000000000..d3a178682
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/epubexport/text-box.fodt
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:styles>
+ <style:style style:name="Graphics" style:family="graphic">
+ <style:graphic-properties text:anchor-type="paragraph" svg:x="0cm" svg:y="0cm" style:wrap="dynamic" style:number-wrapped-paragraphs="no-limit" style:wrap-contour="false" style:vertical-pos="top" style:vertical-rel="paragraph" style:horizontal-pos="center" style:horizontal-rel="paragraph"/>
+ </style:style>
+ <style:style style:name="Frame" style:family="graphic">
+ <style:graphic-properties text:anchor-type="paragraph" svg:x="0cm" svg:y="0cm" fo:margin-left="0.201cm" fo:margin-right="0.201cm" fo:margin-top="0.201cm" fo:margin-bottom="0.201cm" style:wrap="parallel" style:number-wrapped-paragraphs="no-limit" style:wrap-contour="false" style:vertical-pos="top" style:vertical-rel="paragraph-content" style:horizontal-pos="center" style:horizontal-rel="paragraph-content" fo:padding="0.15cm" fo:border="0.06pt solid #000000"/>
+ </style:style>
+ </office:styles>
+ <office:automatic-styles>
+ <style:style style:name="T1" style:family="text">
+ <style:text-properties fo:font-style="italic" style:font-style-asian="italic" style:font-style-complex="italic"/>
+ </style:style>
+ <style:style style:name="fr1" style:family="graphic" style:parent-style-name="Frame">
+ <style:graphic-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" style:wrap="none" style:vertical-pos="top" style:vertical-rel="paragraph" style:horizontal-pos="center" style:horizontal-rel="paragraph" fo:padding="0.049cm" fo:border="0.99pt dashed #ed1c24" style:shadow="none" draw:shadow-opacity="100%"/>
+ </style:style>
+ <style:style style:name="fr2" style:family="graphic" style:parent-style-name="Graphics">
+ <style:graphic-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" style:run-through="foreground" style:wrap="none" style:vertical-pos="top" style:vertical-rel="baseline" style:horizontal-pos="center" style:horizontal-rel="paragraph-content" fo:padding="0cm" fo:border="none" style:shadow="none" draw:shadow-opacity="100%" style:mirror="none" fo:clip="rect(0cm, 0cm, 0cm, 0cm)" draw:luminance="0%" draw:contrast="0%" draw:red="0%" draw:green="0%" draw:blue="0%" draw:gamma="100%" draw:color-inversion="false" draw:image-opacity="100%" draw:color-mode="standard" loext:rel-width-rel="paragraph"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:body>
+ <office:text>
+ <text:sequence-decls>
+ <text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>
+ <text:sequence-decl text:display-outline-level="0" text:name="Table"/>
+ <text:sequence-decl text:display-outline-level="0" text:name="Text"/>
+ <text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
+ </text:sequence-decls>
+ <text:p text:style-name="Standard"><draw:frame draw:style-name="fr1" draw:name="Frame1" text:anchor-type="char" svg:width="5.674cm" draw:z-index="0"><draw:text-box fo:min-height="3.336cm"><text:p text:style-name="Frame_20_contents"><draw:frame draw:style-name="fr2" draw:name="Object0" text:anchor-type="as-char" svg:width="1.663cm" style:rel-width="100%" svg:height="1.663cm" style:rel-height="scale" draw:z-index="1"><draw:image loext:mime-type="image/png"><office:binary-data>iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAQAAAAAYLlVAAAABGdBTUEAALGPC/xhBQAAAAFz
+ UkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA
+ AAJiS0dEAACqjSMyAAAACW9GRnMAAAAGAAAAAAAMc1XTAAAACXBIWXMAAA3XAAAN1wFCKJt4
+ AAAACXZwQWcAAABMAAAAQACdMTgbAAABzUlEQVRo3u3ZPU/CQBjA8X+Jxs3ESUDj4iK+LA5+
+ BBfjqBE1cXB2MlFAEqMgxvhNNL4sLsK3UPQL6ObkoAETz+FKW2mxCPRYnucWUu76/OC59C49
+ cGOCKqrD9kHRc6ddPv7oW2WCwMh0nF63Myz7Tm8hPTNu0pgHMER3scepTbgK6enJNND83RLn
+ /878yRaPmgBZFDuMsNLeWB9gmFQHP77MIg9gsYciR50NFKvtjIy10yk84pSZA7DYpwR8scmF
+ QQCMuoQMpzbh0iAARrlnVn90CWHTsZcAiHPPdINQAuqsc2MQAAnKDUKWEhZ10twaBEDSJWQo
+ YlFj7S9CzwEegkXWIbQsRAQASFJhpplwbRAACS+hANRJBxMiAkDcJeQ4sQkBhYgMoJ+Ozlwo
+ 2YQ7AJ6CRxyiUGnVy3hVKb0Af9v7hUG2Wy9TEQCUelFTDULB2S+YKYGOMcpM6UIccOQnRA6A
+ cSp6ibfI+wkGADBGpTEd8xz1AaAfTQ7huA8AvUw5hVjuA0D/C5OaMN8XACRZ8F0zCggKAQhA
+ AAIQgAAEIAABCEAAAhCAAAQgAAH4zg3feY4w3Xs44M5+oW0qvCWoGcvaIlM3x/f/ab+O738A
+ hOCNQr34oD4AAAAldEVYdGNyZWF0ZS1kYXRlADIwMTAtMTItMjBUMTc6MDg6MzYrMDE6MDB6
+ 5RscAAAAJXRFWHRtb2RpZnktZGF0ZQAyMDEwLTEyLTIwVDE3OjA4OjM3KzAxOjAwgyNmnAAA
+ AABJRU5ErkJggg==
+ </office:binary-data></draw:image></draw:frame><text:line-break/><text:span text:style-name="T1">Illustration </text:span><text:span text:style-name="T1"><text:sequence text:ref-name="refIllustration0" text:name="Illustration" text:formula="ooow:Illustration+1" style:num-format="1">1</text:sequence></text:span><text:span text:style-name="T1">: foo</text:span></text:p></draw:text-box></draw:frame>bar</text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/writerperfect/qa/unit/data/writer/libabw/fail/.gitignore b/writerperfect/qa/unit/data/writer/libabw/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libabw/fail/.gitignore
diff --git a/writerperfect/qa/unit/data/writer/libabw/indeterminate/.gitignore b/writerperfect/qa/unit/data/writer/libabw/indeterminate/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libabw/indeterminate/.gitignore
diff --git a/writerperfect/qa/unit/data/writer/libabw/pass/hello.abw b/writerperfect/qa/unit/data/writer/libabw/pass/hello.abw
new file mode 100644
index 000000000..8103ce823
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libabw/pass/hello.abw
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE abiword PUBLIC "-//ABISOURCE//DTD AWML 1.0 Strict//EN" "http://www.abisource.com/awml.dtd">
+<abiword template="false" xmlns:ct="http://www.abisource.com/changetracking.dtd" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:math="http://www.w3.org/1998/Math/MathML" xid-max="2" xmlns:dc="http://purl.org/dc/elements/1.1/" styles="unlocked" fileformat="1.0" xmlns:svg="http://www.w3.org/2000/svg" xmlns:awml="http://www.abisource.com/awml.dtd" xmlns="http://www.abisource.com/awml.dtd" xmlns:xlink="http://www.w3.org/1999/xlink" version="0.99.2" xml:space="preserve" props="dom-dir:ltr; document-footnote-restart-section:0; document-endnote-type:numeric; document-endnote-place-enddoc:1; document-endnote-initial:1; lang:en-US; document-endnote-restart-section:0; document-footnote-restart-page:0; document-footnote-type:numeric; document-footnote-initial:1; document-endnote-place-endsection:0">
+<!-- ======================================================================== -->
+<!-- This file is an AbiWord document. -->
+<!-- AbiWord is a free, Open Source word processor. -->
+<!-- More information about AbiWord is available at http://www.abisource.com/ -->
+<!-- You should not edit this file by hand. -->
+<!-- ======================================================================== -->
+
+<metadata>
+<m key="abiword.date_last_changed">Sat Mar 29 15:05:47 2014
+</m>
+<m key="abiword.generator">AbiWord</m>
+<m key="dc.creator">David Tardon</m>
+<m key="dc.date">Sat Mar 29 15:05:47 2014
+</m>
+<m key="dc.format">application/x-abiword</m>
+</metadata>
+<rdf>
+</rdf>
+<history version="1" edit-time="50" last-saved="1396101947" uid="1c0ee030-b74b-11e3-87e4-f1c43e104756">
+<version id="1" started="1396101947" uid="3a377838-b74b-11e3-87e4-f1c43e104756" auto="0" top-xid="2"/>
+</history>
+<styles>
+<s type="P" name="Normal" followedby="Current Settings" props="font-family:Times New Roman; margin-top:0pt; color:000000; margin-left:0pt; text-position:normal; widows:2; font-style:normal; text-indent:0in; font-variant:normal; font-weight:normal; margin-right:0pt; font-size:12pt; text-decoration:none; margin-bottom:0pt; line-height:1.0; bgcolor:transparent; text-align:left; font-stretch:normal"/>
+</styles>
+<pagesize pagetype="Letter" orientation="portrait" width="8.500000" height="11.000000" units="in" page-scale="1.000000"/>
+<section xid="1" props="page-margin-footer:0.5in; page-margin-header:0.5in">
+<p style="Normal" xid="2"><c>hello world</c></p>
+</section>
+</abiword>
diff --git a/writerperfect/qa/unit/data/writer/libabw/pass/hello.zabw b/writerperfect/qa/unit/data/writer/libabw/pass/hello.zabw
new file mode 100644
index 000000000..c83395b86
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libabw/pass/hello.zabw
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libe-book/fail/TCR.tcr b/writerperfect/qa/unit/data/writer/libe-book/fail/TCR.tcr
new file mode 100644
index 000000000..448021cc2
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libe-book/fail/TCR.tcr
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libe-book/indeterminate/.gitignore b/writerperfect/qa/unit/data/writer/libe-book/indeterminate/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libe-book/indeterminate/.gitignore
diff --git a/writerperfect/qa/unit/data/writer/libe-book/pass/Broad_Band_eBook.lrf b/writerperfect/qa/unit/data/writer/libe-book/pass/Broad_Band_eBook.lrf
new file mode 100644
index 000000000..5e5b69d65
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libe-book/pass/Broad_Band_eBook.lrf
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libe-book/pass/FictionBook2.fb2 b/writerperfect/qa/unit/data/writer/libe-book/pass/FictionBook2.fb2
new file mode 100644
index 000000000..4348cb75b
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libe-book/pass/FictionBook2.fb2
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <description>
+ <title-info>
+ <author>
+ <first-name>David</first-name>
+ <last-name>Tardon</last-name>
+ </author>
+ <book-title>Hello world</book-title>
+ <lang>en</lang>
+ </title-info>
+ <document-info>
+ <author>
+ <first-name>David</first-name>
+ <last-name>Tardon</last-name>
+ </author>
+ <date>2013-11-17</date>
+ <version>1.0</version>
+ </document-info>
+ </description>
+ <body>
+ <section>
+ <p>Hello world.</p>
+ </section>
+ </body>
+</FictionBook>
diff --git a/writerperfect/qa/unit/data/writer/libe-book/pass/FictionBook2.fb2.zip b/writerperfect/qa/unit/data/writer/libe-book/pass/FictionBook2.fb2.zip
new file mode 100644
index 000000000..848240452
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libe-book/pass/FictionBook2.fb2.zip
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libe-book/pass/PalmDOC.pdb b/writerperfect/qa/unit/data/writer/libe-book/pass/PalmDOC.pdb
new file mode 100644
index 000000000..e64f51488
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libe-book/pass/PalmDOC.pdb
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libe-book/pass/PeanutPress.pdb b/writerperfect/qa/unit/data/writer/libe-book/pass/PeanutPress.pdb
new file mode 100644
index 000000000..ac69913ee
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libe-book/pass/PeanutPress.pdb
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libe-book/pass/Plucker.pdb b/writerperfect/qa/unit/data/writer/libe-book/pass/Plucker.pdb
new file mode 100644
index 000000000..0ed82465e
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libe-book/pass/Plucker.pdb
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libe-book/pass/TealDoc.pdb b/writerperfect/qa/unit/data/writer/libe-book/pass/TealDoc.pdb
new file mode 100644
index 000000000..577a967c2
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libe-book/pass/TealDoc.pdb
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libe-book/pass/zTXT.pdb b/writerperfect/qa/unit/data/writer/libe-book/pass/zTXT.pdb
new file mode 100644
index 000000000..6461b4ff9
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libe-book/pass/zTXT.pdb
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libetonyek/fail/.gitignore b/writerperfect/qa/unit/data/writer/libetonyek/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libetonyek/fail/.gitignore
diff --git a/writerperfect/qa/unit/data/writer/libetonyek/indeterminate/.gitignore b/writerperfect/qa/unit/data/writer/libetonyek/indeterminate/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libetonyek/indeterminate/.gitignore
diff --git a/writerperfect/qa/unit/data/writer/libetonyek/pass/Pages_4.pages b/writerperfect/qa/unit/data/writer/libetonyek/pass/Pages_4.pages
new file mode 100644
index 000000000..43c921392
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libetonyek/pass/Pages_4.pages
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libetonyek/pass/Pages_5.pages b/writerperfect/qa/unit/data/writer/libetonyek/pass/Pages_5.pages
new file mode 100644
index 000000000..cd4438a34
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libetonyek/pass/Pages_5.pages
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/fail/.gitignore b/writerperfect/qa/unit/data/writer/libmwaw/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/fail/.gitignore
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/indeterminate/GreatWorks_v2.hqx b/writerperfect/qa/unit/data/writer/libmwaw/indeterminate/GreatWorks_v2.hqx
new file mode 100644
index 000000000..f89b7631d
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/indeterminate/GreatWorks_v2.hqx
@@ -0,0 +1,180 @@
+(This file must be converted with BinHex 4.0)
+:$h4PFh4(FQ9KG&G[FQYc-J"D9e*8@N9#8J%!!!!D#!!!%,[PXJ)!@PG59!#3#J-
+B!Q3&+!2m!%J!5!"M!!%!!!%!!!!"!!!"!*!R!3!)!!N!N!8"!!%!$!!!!3!!5!!
+!!%J!!!")!!!!5!#3$`i!N"0)!!!!5!!!!Y!!!!)F!*#M5!!!!%J!!!")!!!#(!!
+!!%J!!!")!!!#`3!!!K`!N*)#`J!!!%J!!!,3!!!#(!!!!%J!!!")!!!!5!!!!K`
+!!!")!!!!5!!!!Xm!!!)F!*#5!Y!!!!")!!!#d!!!!K`!!!!#!!)!!!C)!!!!$`!
+!"1!!"!!!!!J!!!!)!&B!N#X3!!%!&3!!#8KPE(CPG'PMB3#3"!%!!3!!!3!"!!%
+!!3!"!!%!!!!)!!%!$J!+!*!&&3!!!!`!N!F"!*!2!3#3#JB&"3!!)2q3"#i!!#$
+rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!
+Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!
+!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!*!'#!#3"3J!N"%)!*!
+&$J!!!X)!!!")!!!#d!!!!K`!N!KK)'C[Eh4PFJ#3"!%!!`!!%3!+!"F!!J!D!!)
+!!!&X!!B!$J!+!*!&&3!!!!`!N!F"!!i!#J#3"48!!3!-!*!(!3!1!!S!"!!!!"8
+!!J!-!*!(!3!1!!S!N!89!!3!$!#3"`%!%!!,!*!&&3!)!!`!N!F"!"%!#`#3"48
+!%!!-!*!(!3!4!!S!N!89)!!!$!#3"`%!$J!+!*!&&3!J!!`!N!F"!!i!#J#3"48
+!3!!-!*!(!J!5!!i!N!89!3!!$!#3"`%!%J!+!*!&&3)!!!`!N!F"!!i!#J#3"48
+!!!!-rrm!N!8"!!i!#J#3"48!!!!--c2rrfCQ!!%!$J!+!*!&&3!!!!`!!-c-rrm
+!!3!2!!X!N!89!!!!$J#3"`%!*!!F!*!&&3!!!#3!N!F"!!B!"3#3"48!!!!'!*!
+("!#3$`%!N!S'"38!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!
+!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i
+!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3
+Z!!!Jrj!%,J!!!3#3$`'!!*!*"J8&!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!
+%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q
+3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$
+rN!3Z!!!Jrj!%,J!!)2q3"#i!!!%!N!m#!*!+"J8&!!!Jrj!%,J!!)2q3"#i!!#$
+rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!
+Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!
+!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!!%!!3#3$3%!N!S'"38!!#$rN!3
+Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!
+%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q
+3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!!3!#!*!0!3#
+3#JB&"3!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!
+!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i
+!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3
+Z!!!"!!-!N!d"!*!+"J8&!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q
+3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$
+rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!
+Jrj!%,J!!)2q3"#i!!!%!N!FL!*!(!3#3#JB&"3!!)2q3"#i!!#$rN!3Z!!!Jrj!
+%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q
+3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$
+rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!"!!!!*3#3#`%!N!S'"38!!#$rN!3
+Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!
+%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q
+3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!!3!!!!%!N!F
+N!!!!!3#3#JB&"3!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!
+Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!
+!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i
+!!#$rN!3Z!!!1!!!!!3#3#`%!N!S'"38!!#i!*!!!,J!"B3"*rRFZ!!)J!'X!!#i
+!!b!!NJ!!,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!
+%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q
+3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!N!BZ!!%!!!!%!*!&!3!#!!!!"J#3"3)
+!!`!!!!N!N!8"!!3!!!!)!*!&!3!&!!!!"`!'!!!!%3!(!!!!#3!)!!!!"`!*!!!
+!"3!+!!!!"!!*!!!!!3!,!!!!"!!-!!!!"J!0!!!!"3!1!!!!#J!2!!!!#J!3!!!
+!#3#3"F!!N!3"3`#3$"8,!!!!+Iq3"!#3$4d!N!81!*!(!3!1!!!!(!#3"h%!(!!
+!!%3!N!FG!%3!!!"S!!!!!3!!!!i!D!!!!(X!!!!#!!!!$!"l!!!!N`!!!!-!!!!
+(!*-!!!#K!!!!"!!!!!B!S3!!!+m!!!!&!!!!"3#[!!!![3!!!!B!!!!*!,d!!!$
+,!!!!"`!!!!S!b`!!!0N!!!!)!!!!#!$C!!!!j`!!!!N!!!!0!1F!!!$e!!!!#3!
+!!!m!p3!!!3-!!!!*!!!!!3%$!!!"%3!!!!N!!!!A!4%!!!%I!!!!#3!!!!%"(`!
+!!5d!!!!*!!!!%!%Y!!!"1`!!!!N!!!!"!6X!!!&*!!!!#3!!!!%"53!!!9F!!!!
+*!!!!!3&A!!!"C3!!!!N!!!!"!@8!!!&c!!!!#3!!!#)"F`!!!B%!!!!*!!!!!3'
+"!!!#H3!!!!N!!!!0!*!&$J!!!!N!N!81!!!!(!!!!%J!!!")!!!#`3!!!K`!N!8
+"!!!!5!!!!%J!!!,"!!!#(!#3"3)!'%%JFfPYF'aP)%GbC@&d9fpbDh-J-Li`)'C
+TE'80$A4PFh3JEfBJCQpZG(-J1L"LEfaN)'PdB@aTBb!JG@jNCA*XD@jP)'peG'a
+TEQ8J)(0SB@4[Gb"NEh9LE'8JG@jNCA*XD@jP)'0[EA"bCA0c)'9iF'&ZC#"cGA"
+PFR0eBR-JFQ9N)'GbC@9Z)'*XG@80-63JF'pTER4c)$-f)("[D@jdFb!f)("[D@j
+dF`da,M8JD@jdCA*XD@jP$6)JD@jdCA*XD@jP$@0PER4PFJebD@GSG!eQG@aX$@a
+PCR3J-5ie$@CTFR0d)$%Z03ebD@GSG#!h$A0[E@8JG'&LF`N*#3ecEfeP)'aTEQ9
+c)#!k)!d0FfpYC5"[G'KPFL"RFQ&`D'PMFb!k)!d0FfpYC5"dCAKdBQpi)$SJ$C!
+&B5"NBA4P)"8J+#"QEh*YBA3J5R9Z)$%f,#!b-$!a-b!T$3aK)("KCf8JBR*PB@X
+0!*!%!aJ#C!#3"!-B!Q3&+!2m!%J!5!"M!!%!!!!"!!!!!3#3$2q3"J#3#[q3"J!
+!!!(rN!J!!`#3#3%!5!!!!Y!!!!)F!*!l!3!"!!%!!!!,!!8!$MrpVk$9Hl3ei8G
+!!ZhEDZFG)A@k!Di"!!!9!!!!$!#3#3%!!!B!!!%!%J!!!&S!!!!'!3#3"!N!!!!
+"!*!&!3!!"ri!!!(U!!!$9J!!!"B!N!8*!$B#!!&!!!!!N3!!!8%!!!$1!!!!!3!
+!!!%"33!!!*%!!!&!!!!!cJ#3%!)!!8%!!!$Q!!!"33!!!6F!!!!$!!!!!J&"!!!
+!jJ!!!8%!!!%h!*!3!J!"3!!!!8`!!!&!!!!"V!!!!!3!!!!$!8!!!!&-!!!"3!!
+!!D`!N"!$!!&5!!!!c3!!!@3!!!$X!!!!!3!!!!3!N"i%!!&6!!!!r`!!!@-!!!%
+R!!!!!3!!!!8!!3!5!*!D#!!"8`!!!6d!!!&S!!!"M!!!!!%!!!!'!!!!3J#3'J`
+!!8B!!!'J!!!"CJ!!!H,fJ!!"!!!!"`!!!+S!N"S"!!&l!!!!T3!!!BN!!!$V!!!
+!"3!!!!J!!!!i!*!%!3#3&3%!!B%!!!%%!!!"R3!!!@)!!!!&!!!!#3!!!A3!N!3
+"!*!@"3#U!!8!!3!!!!%!!!%!N!F"!2q3"J%!N!F"!2q3"J%!!!(rN!J!!`#3#3%
+!5!!!!Y!!!!)F!*!l!3!"!!%!!!!,!!8!$MrpVk$9Hl3ei8G!!ZhEDZFG)A@k!Di
+!!!!"!!!!!3!!!3#3"`%!rj!'!3#3"`%!rj!'!3!!!Iq3#!!$!*!*!`!#!!N!!!!
+*!!$rr`!#kci!N!6J&rrr!!,Y`J#3"1!Brrm!!Zj0!*!&aIrr!!)!N"-"!!%!!3!
+!!!X!"3!12rf[S09lY$AK4d!#lGYUjadKGES"VJ!"!!%!!!!"!!!"!'CQc-`!!!%
+!rj!'!3"QCXc-!!!"!2q3"J%!!!(rN!J!!Iq3#!!"!%J!!!,3!!!#(!#3+Y9m!'#
+h9!!#J!!bEJ!EYeS!!3!"!!%!!!!,!!8!$MrpVk$9Hl3ei8G!!ZhEDZFG)A@k!Di
+!!3!"!!!!!3!!!3#3"`%!rj!'!3#3"`%!rj!'!3!!!Iq3#!!$!*!*!`!#!!N!!!!
+*!!$rr`!#kci!N!6J&rrr!!,Y`J#3"1!Brrm!!Zj0!*!&aIrr!!)!N"-#!!%!!3!
+!!!X!"3!12rf[S09lY$AK4d!#lGYUjadKGES"VJ!#!*!*9J#3"e2rN!B!A`#3#2q
+3"J#3&`%!B,lL!!%XH!!!!'%V8J"K+e)!9SK3!&DAbJ!+!'#lM!"JZj3!B,ZF!&D
+ANJ#3"9B!!-m!!!%XJ!&'!%J"5!"*!8J!!3!"!!%!!!!,!!8!$MrpVk$9Hl3ei8G
+!!ZhEDZFG)A@k!Di!#3!#!!%!!J!$!!3!"3!'!!F!#!!*!*!'!3!!!`!"!!-!!3!
+"!!%!!!!5!!%!$J!+!*!&&3!!!!`!N!F"!!i!#J#3"48!!3!-!*!(!3!1!!S!"!!
+!!"8!!`!-!*!(!3#3$`%!N!S'"38!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3
+Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!
+%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q3"#i!!#$rN!3Z!!!Jrj!%,J!!)2q
+3"#i!!#$rN!3Z!!!Jrj!%,J#3"JF!!3!!!!8!!J!!!!B!N!85!*!4%J#3"4`!!!'
+"!!!""!!!!Cd!!!&L!*!)EQpbE@&X)'*[E'3JDA4KE'PM!*!'!3%!&3!"!!`!N!F
+9!!!!$!#3#!&l!!!!T3!!!BN!!!$V!!!&BQ&cD@-!%!&'!!!"S!!!!@B!!!(LpS!
+"CJ!!!D!!!!&8!!!"T`!!!8m!!!(-!!!"6`!!!F`!!!&2!!!"c!!!!9`!!!(L!!!
+"A!!!!H)!!!&F!!!"iJ!!!@d!!!(G!!!"A!!!!H)!!!&,!!!"j`!!!8B!!!(A!!!
+"4J!!!GF!!!&'!!!"e`!!!8F!!!(3!!!"4`!!!G!!!!&(!!!"d!!!!8F!!!(3!!!
+"4`!!!G!!!!!'!9-!!!%p!!!"D!!!!B`!!!&S!!!"23!!!9J!!!&U!!!"8`!!!B`
+!!!&H!!!"L`!!!@!!!!&h!!!"B!!!!A3!!1e`!!!"!!!!$p8!!!l9!!!!jJ!"$NC
+"8&"-r3#3&`pdCA0d4h*PBA4AEh*VFc)#!!!!@PG59&T&3P)!N!CD9e*8@N9#8J#
+3'-hM@C`!!"S)!!!3Z`#3K4S!!3'[!P8!+`!&!#X!"3(D!PS!+`!&!GS#HJ!!!(J
+!$`!!!%J!5!#3"!,`!N$rmIrZ!`N#8Q-#"5J$r!%!!!!"D!&S!*!%$V!,3!!"!3!
+!C!!"!!!!!3!#!!!!!5F2!!%!N!i3!*!*%!$rYIqQ$bd,QJ!)!3#3$4N"!!!$!J"
+Jrj!)UP@U9DT9UP8!N!KrrrrrprrrrhrrprprrrIrGrrrrhIrrrphrprrGrrprhI
+rhIphrphr9IrGreArhIp9rqlr9IqlreAr9Ip9reArGpehhAIGGpe9[eAr9IY9re@
+l9Ip9ZeAr9Ep9lPAl9Hj9ZeAZ9EY9lP@l9HT9Ze@Z9ET9Ue@k9DY9kP@U9Dj9UUS
+9UP@U8DT9UN@U9+T&UP5U4+S9UN5U8DT%UK'U4+S4UN#U%DS%UK'U4+S!UN5U!+T
+!UJ#U"+S!L#+))SJLL#+U!+S!UJ#U!+S!%3#U!%3!UJ!L!+S!)J#)!#)!L!!L!)J
+!)!#)!!)!L!!!!)J!!!#!!!J!J!!)!)!!!!!)!!!!L%3L%BK%)K%4)N5)%5*%L)"
+!)"!)"!)"!3)%#"!J3)$JF$JF$JH$`B-($K`iF1$"L%3L!)K%)J!4)N3!%5*%!)*
+%+"!S4))"QFaQ-jR-CM0hZphZGl[GlZlGZhIZhEYhIlrIlrIlrIlqrI[hlpqrIaq
+2aq2aq(`qq2(MaimI2RahZphrGl[GrqlGZrrZhE[rIE[AlpHlIIicCXbC-fE-QDU
+3#-b3#)L3#2m!!!$r!!!!J*!)r`#3"`L!J!J)J)!)CJ!!!*N!!!$rL)L)riL)L2q
+!N!Ir!2m!r`$r!2rr!!$rr`!!Gj!)!2rrr`$rrrprN!J!rj!(phprprGrIrHCrrr
+rC[rrr`"hGhF!GhGh!(q3"r#3"!q3"*PQCTQCCQDC!!JF2Rmq(!J!#"3U95S8#,%
+`!a[B`!b0J"!#)!%)3!3)&#*"J!%#")$!)4)-"!)"ri#!J2m)#!J!Ihpr!2Ihpi"
+!)!!#"!J!JN3j4))"!3(iG#*(MaFLFEqJ[lfpr3Ap9D"!3&8+"!5)4#)4%5*%L)&
+#*"L"3L3BUJ#!!)J!J!!$K%J`$!)"!B#!36i)#"6M3+!!!!3+!*!%"Q3!!J!)rj!
+'r2ccm`8&rrpNC!)#hGd)#!B'm[))#)5%4NB!!+@P!*!%e03#!UZVkZSI(lHh&"3
+!!'4N%4&@9L`X"3@3!*!!FA%k1X#3"S#3"N#3"J#3"[q3#Xc-rj!%QCRrN!4QC[q
+3"$-crj!%!!$rrmc-rj!%c*!%rrr-c*QCrrr-c'CQrrr-c$-crrr-c!!!rrqCQIq
+3"*QCc-crrjQ3"2rrQCPQC[rrQCNc-rrrQCN!!2rrCQErN!4QCXc-rrpQCTQCrrp
+QN!6rrfCQ-c2rrfCQ!!$rrc-crj!%-c2-c2rr-c1CQIrr-c0QC[rr-j!%rrmc-`!
+!rrm!!2q3"!!!c-crr`!!QCRrr`!!CQErr`!!-c2rr`#3"-c-rj!%c-crrmb3"2r
+rQCR-c2rrCQE-c2rr-c2-c2rr!!$-N!6rrmb3#TQCc*!%CQE-N!3c-mb3"!!!c-b
+CQIrrc-bCQFb3"*Q3"-c-QCPQCXc-QCNc-mc-QCN!!-c-CQErrmc-CQE-N!4QCTQ
+Cc-aQN!6-c'CQ-c2-c'CQ!!$-c$-crrr-c$-cc*!%-c1CQFc--c0QCXc--j!%c-`
+c-`!!c-`!!2rrc-`!!-b3"!!!QCR-c!!!CQE-c!!!-c2-c!#3"*QCrj!%QCRrrmc
+-QCRrrjQ3"2rrCQDCQIrr-c1CQIrr!!#CQFc-rrqCQFb3"*QCc-bCN!6-c'CQQCR
+-c$-cQCR-c!!!QC!%rrqCN!6-c*Q3#QCQQC!%-c1CN!3!!*QCCQErrjQCCQE-c*Q
+CCQDCN!4QN!5CQ@CQ-c1CQ@CQ!!#CQ6-crrqCQ6-cc-bCQ6-cQC!%-c0QCTQC-j!
+%QCNc-`!!QCN!!2rrQCN!!-c-QCN!!*Q3"!!!CQDCQ3!!-c1CQ3#3"'CQrj!%CQE
+rrmc-CQErrjQCCQErrfD3"2rr-c0QC[rr!!"QCXc-rrpQCXb3"'CQc-bCQ@CQc-a
+QN!6-c$-cCQE-c!!!CQDCQIrrCQDCQFc-CQDCN!4QCTQCCT!%QCNc-fCQQCN!!'D
+3"2rrCT!%c-aQN!5CQ@D3#M-cCT!%!!"QCM-crrpQCM-cc-aQCM-cQCPQCM-cCT!
+%-j!%CQBc-`!!CQB!!2rrCQB!!-c-CQB!!*QCCQB!!'D3"!!!-c0QCJ#3"$-crj!
+%-c2rrmc--c2rrjQC-c2rrfCQ-c2rrc13"2rr!!!c-mc-rrmc-mb3"$-cc-bCQ6-
+cc-aQCM-cc-`cN!6-c!!!-c1CQIrr-c1CQFc--c1CN!3c-jQCCQBc-jQC-j!%QCN
+!!$-cCQErrc-cCQE-c$-cCQDCQ6-cCT!%-c0QCM13"'CQ!!!cN!6rrc13"-c--j!
+%QCNcN!4QCM13#J!!-c-!!2rr-c-!!-c--c-!!*QC-c-!!'CQ-c-!!$13"!#3"[q
+3"!!!rrr-c!!!rrqCQ3!!rrpQCJ!!rrmc-`!!rrm!N!6-c2rr!!$-N!3!!-c-QCN
+!!-c-CQB!!-c--c-!!-c-!*!%QCRrr`!!QCR-c!!!QC!%!!#CQ@CQ!!#CQ6-c!!#
+CQ3#3"'CQrrm!!'CQc-`!!'CQQCN!!'D3"!!!CQBc-`!!CQB!N!3c-rrr!!!c-mc
+-!!!c-jQC!!!c-fCQ!!!cN!3!!$-c!*!'rrm!N!6-c!#3"*QC!*!%CQB!N!3c-ql
+Z!*!%hGd!N!5lZ`#3"+UU!*!%L)J!N!4hG`#3"&99!*!%4%3!N!3L)J#3""%4!*!
+'lZi!N!6Gh3#3",Zl!*!%UUS!N!5)L!#3"(Gh!*!%998!N!4%4!#3"#)L!*!%%4%
+!N!EZlJ#3"0hG!*!%ZlX!N!5UUJ#3")L)!*!%GhF!N!4993#3"%4%!*!%)L)!N!3
+4%Hk3"Yf3"VZ3"UU3"SL3"RH3"P@3"N53"L+3"K'3"J#3#33!N!B"!!!"rj!'!*!
+*!Iq3"J#3"bd!!Iq3"J#3"eS!!Iq3"J#3"iF!!Iq3"J#3"l3!!Iq3"J#3"q%!!Iq
+3"J#3"J%1!!(rN!B!N!B"1`!$rj!'!*!*!`#3"[q3"J!!!!,rN!B!N!N#rj!'!*!
+(Y!!"lZi!N!5)L!#3"`%!!1lZ!*!%998!N!8"!*!%rrm!N!5)L!!!!!(rN!6-c2q
+3"!#3"J(d!!)!#3!!!!5!!*!K"U3!!1!9rrm!!J!*!!!!#3!!rrm!!ZXq!*!%i"I
+rr`!#lF)!N!6J'2rr!!,Z63#3"FArr`!#!!3!5!!!!!5!!!!*!!!!")!!!'Arr`!
+#9#X!N!9Qrrm!!P4c!*!&D2rr!!*9,3!#!!5!!!!%J!"9T`#3"Arrr`!#9E%!N!9
+prrr%!P@j!!#2j!!!rrr!!PBB!!!!"J")!!!!")!!!!N!!!!%J!!!#3!!!!5!!!$
+(rrm!!QrR!*!&DIrr!!,`JJ#3"3)!%J!!!!5!!*!%Drrr!!,`p!#3"@hrr`!#mCS
+!N!6J!2rr!!*6E!#3"3%!"J!5!!!!")!!!!%!!!!%J!!!!3!!!!5!!!!#8kF!N!6
+`!2rr!!-*-J#3"2!"rrm!"!!*!!!!")!!!!%!!!!%J!!!!2!&rrm!!`PM!*!%i"r
+rrb!$#Ad!N!6J"[rr)!-!"J!*!!!!")!!!!N!!!!%J!!!!3!!!!5!!*!&i#,rr`!
+$#Td!N!6J"2rr!!-+V3!#!!%!!!!%J!!+``#3"1!$rrm!!`V6!*!%m!Err`!$#bF
+!N!6`"rrr!!-,T!#3"!'!!!%!!!!,!!8!$MrpVk$9Hl3ei8G!!ZhEDZFG)A@k!Di
+!!J!!!!X!"3!12rf[S09lY$AK4d!#lGYUjadKGES"0!!'!!!!#`!&!!irrDqJeAZ
+d0H&(3!,YffVR(5&eZJ(Z!!8!!!!,!!8!$MrpVk$9Hl3ei8G!!ZhEDZFG)A@k!3)
+!"!!!!!X!"3!12rf[S09lY$AK4d!#lGYUjadKGES"!!!"!!!!#`!&!!irrDqJeAZ
+d0H&(3!,YffVR(5&eZJ$Z!!)!!!!,!!8!$MrpVk$9Hl3ei8G!!ZhEDZFG)A@k!2`
+!"J!!!!X!"3!12rf[S09lY$AK4d!#lGYUjadKGES!,J!&!!!!#`!&!!irrDqJeAZ
+d0H&(3!,YffVR(5&eZJ$b!!3!!!!,!!8!$MrpVk$9Hl3ei8G!!ZhEDZFG)A@k!&B
+!!`!!!!X!"3!12rf[S09lY$AK4d!#lGYUjadKGES!#!!$!!!!#`!%!"%rr1bM##J
+4R&NN3!1,YXK)Bme$j3"@!!!!+!)!J!!!!`Cf-Li`,M%D8hPYB@jdC@-J4h*PBA4
+AEh*VFb"f-Li`,M%!!!!9&&0jE@&ZG'9M)%GbC@&d9fpbDh1U!!!"!!!!$p8!!!l
+9!!!!jJ"@LhJDFJ!!!"`!jJ!*9e"66J!!!&*38Nj8!!!!AP""9#-!!!"U8'a89!!
+!!(C1H%9N!!!!JNGb4&-!!!#14'&)8`!!!*T"8P*c!!!!TRCPFR-!!!#b8e45)!!
+!!,i!!Irr!*!&9SG-!!(rr`!!!"i!9SL`!!(rr`!!!*S!9SG!!!(rr`!!!k!!9SF
+N!!(rr`!!#JJ!9SF`!!(rr`!!#K!!9SKm!!(rr`!!#a3!9SFd!!(rr`!!$3`!9SF
+X!!,rr`!!$T!!!&D(',rdrrm!!!km!&D($#QJ:
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/Acta_1.0.hqx b/writerperfect/qa/unit/data/writer/libmwaw/pass/Acta_1.0.hqx
new file mode 100644
index 000000000..af338e613
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/Acta_1.0.hqx
@@ -0,0 +1,24 @@
+(This file must be converted with BinHex 4.0)
+:#R4PH(3a,Q&MG'%!Eh4XEN&$9%%!N!3#V3!!!SZ@J`!$!!%!!3!!!"!!!!!-!*!
+*%@%JFfeKE'`J3@0dB5"QD@aP!!!!&J!"!*!&$J!+!"!!!!!-!*!*"J#3"`%!!3!
+!!"!!!3!-!*!*&@*[E'3JDA4KE'PM)(9ZC'9bE'PZC3!!!'B!"3#3"3i!#J!3!3!
+!$!#3#33!$J!+!"!!!!!-!*!*"3!1!!S!%!)!!!`!N!N,!!i!#J!3!!!!$!#3#3`
+!$J!+!"!%!!!-!*!*"J#3"`%!!3!!!"!!!!!5!*!*%c%i)("[D@jdFb!a-L"`EfP
+ZG(-!!!!U!!)!N!88!!m!%!!!!")!N!N+!!i!#J!3!!!!$!#3#3B!N!F"!!%!!!!
+@!!!!$!!!!!%!N!823fpeFQPPFL"$D'PMB@G[!!!!+J!#!*!&$!!+!"B!!!!-!*!
+*#!!3!!`!N!8-!*!*"J#3"`)!!3%!N!B-!*!*"f&Z)'PdC@d!!!!@!!%!N!83!!`
+!N!8-!*!*"J#3#3%F&!!%TD@Pe`!!R!"!J1j)!'PG1!!!S#-!BK&)!'*V!%#!!*!
+&'A6@!!%!D3!!!(@*k!"eF%3!"kSf!*!'(X`!#!#-!'N!N!N#!'*Z`!"LEaJ!D8R
+U!!(qNJ!!!'*V!!!!(V`!!"l-!!Kqd!!)!'P'VJ"T4VB!D8Dq!"YB'!#3"4YB'!#
+3#@P+6J!"rMJ!#!!%!!!!BJ#3$Zd"!!"16&42$5X!!!%!!!!"e3!!!08!!!#f!!!
+!!JCdCA0dE(ID!J!#!&4&@&4-9e4&!3!!R!#!!!!+G'9iG$%ZB@0dB3!#!!)!Eh4
+XEN&$9%%!N!J#!'pdE'j"3e4"!*!Bcl8aRJ#3"J+,!*!%%3#3"!),G'9cG%aA4h*
+KF'J#!!)!9%9B9%aA9%8"!!(!!F!!N!3#G!#3"!'m!!!)!*!&!e3!!!J!cP8Urmj
+9+a)!N"B$k3!"!*!)!qd!!3#3$!`!N!3#!!!!!J#3"3)8(!!!!"3!%!!-!*!(%!!
+-!*!0"35PTDAA!!!!H!!2!!!!5!")!*!%![!#32rarqi$#3*5B`)&+!2m!3!!!!&
+S!@J!N!31X!Y!!!%"!!"N!!%!!!!"!!)!!!!"*`m!!3#3$K!!N!N3!2qerkB2,3Z
+D!!J"!*!0'3%!!!!)!$B!%J'U!FS!!!!B!3#!!*!%%%&MG'%J3faKFh0TBb!a,M!
+!!!%!!!!"e3!!!08!!!#f!'*[9"S8!!!!(!#f!!C-38*-!!!!1P&28&3!!!"'88K
+%8J!!!&*69&)J!!%!AP"6493!!!"f9e0*@J!!!)*fCA*c!!!!MJ!!rrm!N!9LD`!
+!!2rr!!!!"J"LEaJ!!2rr!!!!$!"LDX!!!2rr!!!!*!"LDLJ!!Irr!!!!+!"LDKJ
+!!2rr!!!!-3"LDI`!!2rr!!!!V3"LDM3!![rr)!!!Z3"LDL4LL!:
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/BeagleWorks_v1.hqx b/writerperfect/qa/unit/data/writer/libmwaw/pass/BeagleWorks_v1.hqx
new file mode 100644
index 000000000..ab059fee7
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/BeagleWorks_v1.hqx
@@ -0,0 +1,49 @@
+(This file must be converted with BinHex 4.0)
+:#R4PFh4#C@&RE'8!3PGhF%*ADh-"!!!!#H-!!!&Lml4#9fYc3PGhF%*AGh!!N!8
+"!*!(!3#3"J%A!*!%"D`!#3!!!!N!N!`"!*!%&`!$!!m!!!")!%J!N!3#m!*!rr(
+rlJ-*!P*M!J8S!r`"!!!!!@J"D!#3"!k`#d!!!3%!!'3!!3!!!!%!!J!!!!%R$`!
+"!*!1%!#3#4!!rlArTJmY#jS!#!%!N!dC!3!!!4F!N!J"&`#31!C(C@jPGQ%(3Qp
+[DfeKEJG$D'PMB@G[!!!'P!!!!MJ!!3!!"S)!!!!'!!-D&!!!!"`!4J!"Ge"[F`!
+!!"*69&)J!!!!(J2Trrm!N!Lrp2rr!!!!$!#3"'Yc!!!""!"D'*J,3Q9KCfaP9fp
+bDh-!!!!8!&SBQ!Y#C@&RE'9AEh*VF`!!!"3!@KLB#d*PB@GXC9G[FQYc!!!!&!"
+D'*J,3Q9KCfaP9fpbDh-!!!!8!&SBQ!Y#C@&RE'9AEh*VF`!!!"3!@KLB#d*PB@G
+XC9G[FQYc!!!!&!"D'*J,3Q9KCfaP9fpbDh-!!!!8!&SBQ!Y#C@&RE'9AEh*VF`!
+!!"3!@KLB#d*PB@GXC9G[FQYc!!!!&%%JFfPYF'aP)%*PB@GXC9G[FQYc)'CTE'8
+J1L"NC@CKG@ad)'C[ER3J4f9ZCACK)$%bF(30!*!&!3#3"Q*[E'3!N!8"!*!')!#
+3"3)!N!CTG'&XD@-!N!8#!*!')!#3"33!N!CeEQ4PFQaTEQ8!N!8%!*!')!#3"!%
+!N!GcGA"PFR0MFQP`G!#3"!-!N!GcG@*cBh*TF(3!N!3'!*!(GA"`CA*MBA0P!*!
+%$!#3"da29d953d&643#3"!J)!*!'Eh9dE'PZC3#3"4J!N!CcD'&NEhF!N!83!*!
+')!d!N!IX!*!%FQ9N)(4PH(3J!*!'!CJ!N!4RFQ9PEL"dCAKd)!#3"J%3!*!%H@9
+XE'ph)!#3"f3!N!30!*!*!3!!BQp[DfeKEL"QEfjd)!#3#3-!!'0SD@0KCfmJ!!!
+!2!#3#'0SD@0KCfmJ0$K`G#`J!!!!1J#3#'0SD@0KCfmJ-6"`G!!!!!B!N!8#!!!
+0!!%6!!"N!*!1%`%!Bf9ZG'9b)'aTEQ80!!%6!!"L!*!1%`%!FQPRD(3JE'PZC3d
+!!4-!!'J!N!i6!3"QG@aX)'aTEQ80!!%6"3"K!*!1%`%!-68`*5"TER4PFQaTEQ8
+0!!%6#J"K!*!1%`%!-M!`*5"TER4PFQaTEQ80!!%6!!"K!*!1%`%!!!-!"!-!!!%
+6!!"K!*!1%`%!EQ9h)(0PBh4TEfiJGfPdD#"dGfmJBfpXG@eZF`d!!6%!!(%!N!d
+&!#!!!!%J!$i!!!-J!&J!!!)J!(%!!!3J!)`!!!8J-3%!GfPdD#"cEfeP)(4KBR-
+0!!%V!!"K!*!0"!!J!!!")!!q!!!$)!"B!!!#)!"a!!!%)#X"!("KCf8!!J!#!J!
+JC'&dC5!!!J!$!J!J+$B[-c![-6-T)(4TE@8J!!)!"!)!)#JJ1$Sa15N0!!%V!!"
+K!*!0"!!J!!!")!!q!!!$)!"B!!!#)!"a!!!%)#X"!!d"!0`!hJ$J!1)!j!%!!#3
+!!!!f!!!!0J!f!!!!0J!"!#"CM`!"!%J!!3&`6UeJ%L"I)"#`VICBCKS[$$m&-!C
+53$m!-!D3!%3r!(!!(`"1ZZrD%`!!B3#3$K1klm5k4f0)F!!`"NU!CLT`!$!()'h
+fY0#!)J$5JG#"FJ!b-!J%5S&Q%#m-2`F`"j!!46m!6VV`I'!@,``r"h!!-!Gb!$)
+&N!#"8N!r!%kkm'49Mbm-2`Fr"A!"(`"1Z[e5,``r,ICB2bhf@Mm&2`3I,[rr6VV
+cR"eZrrN0!3d"$3%0!3$F!0i!i!$L!1i#!!!N!!!!0J!!!$B!0J!!!$B!!3!S!!%
+!!3&`!!%"R3!#!BiJA`'G!Chf@'BD,``r"6!'8N!r!$!'N!"%2`"`!"m!6VV[fK-
+!!'%!N!i6ZZr%ZNGM5(!!-!C+J'BUF!!`"b"YpV63J#)!dS(3JA)!-M!)"%U"CK!
+[$$m(-!H3!%8r!%kkm(aJ&Lm-2`G`!$!(FJ!b"C!!J9*!2`"1Z["N9Bm[$$m(2`9
+`!4m!6VVp8Lm-2bhf@$mYpPSr"6m%(blrrdkkmj`GE[rj$3%0!3d"G'KP)'C[Eh4
+PFJd"!!!"!!1`!!!%X!$N!!!&P!$Z!!!"`!!!!ki"$3!-!!!!)5!!!!!#!*!&!J#
+3"!%"I`&%!*!%!Dd",!!`!!!!)5!#!!!!J!!I!!!!J!!I!!%!L!(X!*!%!Dd",!!
+`!!!!)5!#!!!!J!!I!!!!J!!I!!%!L!(X!*!%!l$rN!3!A"Q8!!%!!`!3!&`CN!!
+!!3!3!!!#)!!!!L!!!3&)!#!!N!3"i!!"!UJ#G3!!,`%[#`&J!P8!(`!3!8J!9J%
+d!'8"03!"!!%$+!!!!S3!!2r`!*!%!aJ#C!!!!%J!!!")!%J!!!")!%J!!!")!!!
+!!3"F'Ca#3!"aFHS!FA(U!(&akJ#3"J1Z!!!$VJ&%!!!#(!!!%`!!B3#3$K1kl`!
+")!!q!!!$)!"B!!!#)!"a!!!%)#X"!!!%)$%"!!!&)!#39J%"!Im"N)J!A"QB!!%
+!E!!-!!!!)5!!2bJ!$NKZm[%!!!%!!!!"(!!!!"`!!!"'rrrrr-b3"1$Xc*!%rrr
+mcrrrc*!%i1c-c-c2rrm-+R4PFh4#C@&RE'8`!J)!!!"#9hG`3PGVF`#3#%*AGh"
+#9fYc!*!BcI@E+3#3"J&Lc*!'crrrc1$YhrrrlT!)rrrpi!lrN!i!$rrrc*!+rrr
+`rrrmc-c-hGhGh-c-c-rrN!61lZlZc-c-cZlZlXcrr`rqlGhGhZk3"0hGhHl[m!!
+!!$B!!3!"!'3!!3!"!b!L!!!"!"J!N!3)!%i!!J(F!RB!!!!-#d*PB@GXC9G[FQY
+c!!!"!!!!!4`!!!!F!!!!4J"F(6JD&!!!!"`!4J!"Ge"[F`!!!"*69&)J!!!!(J2
+Trrm!N!Lrp2rr!!!!$!#3"02[:
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/ClarisWorks_1.0 b/writerperfect/qa/unit/data/writer/libmwaw/pass/ClarisWorks_1.0
new file mode 100644
index 000000000..3d3118a5b
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/ClarisWorks_1.0
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/ClarisWorks_2.0 b/writerperfect/qa/unit/data/writer/libmwaw/pass/ClarisWorks_2.0
new file mode 100644
index 000000000..8526384a6
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/ClarisWorks_2.0
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/ClarisWorks_6.0.cwk b/writerperfect/qa/unit/data/writer/libmwaw/pass/ClarisWorks_6.0.cwk
new file mode 100644
index 000000000..9162e3d2c
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/ClarisWorks_6.0.cwk
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/DOCMaker_4.hqx b/writerperfect/qa/unit/data/writer/libmwaw/pass/DOCMaker_4.hqx
new file mode 100644
index 000000000..e28253470
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/DOCMaker_4.hqx
@@ -0,0 +1,1496 @@
+(This file must be converted with BinHex 4.0)
+:#(4PFh3ZC'dd!%&38%a%Dd"3)3#3"J%Ka9,!!*!%!3!!!4Y@!!%D9J!!"Qm!N#!
+)G'9cG#jNE63!!J!!!%&38%a%Dd"3)!#3#d&38%a%Dd"3)!#3&md63hd!N!8")F8
+!N)3@mf!+!!"$4%9'!"i!!%MRi-K1ZJ$b3IVrkL!)S&91ZJ#3!%cI%`G1qJ%@3IV
+reY(m!!!@lb!)S&91G8MR"J"C6b"[!"!LE`!8,#m!'"kB(eJ!!4pB!!)I@!!$+KG
+d!'"%%KJ3!3*!!)"R$0)"%!&)J%M!e)"J+"k"(eJ!!4!"!N!!3'F--"IP51*!5-$
+8J'!1(eJ!!KpB!!-N&q@+iS,GX5J!8i9+K@ki@%p-h`"J6R9)ja!J*%!J,!!!*JU
+@J'G!5S"Q(%)X!!3`2+LITdB[#$!mSCLM4V(I9X"%!"P!!!3[!bm+6VVr4#m!6VV
+r6Nr[!!`T5J!!5L`!"'F%F!'KQ%cI"!K1G8(kr[V4r!!!&ZSJ#+"9`Ba1G5"I)NM
+5f,#BE!*1dE#BE`*1d6)BX*KQ"0$36Y"85&(*rr41d8je51F3)&P2*'m!&LB[!""
+#Pc![!"3-3!!,BPc33$!l!!C1q`!#!"J!)J!b!$`!8J"5!&)!5J"5!&)!8J"5,`S
+[!dkk#cjJ-&P2,`S[!dkk%!)J(bk!B#![#Lm$6VS4LQ!@,`S[!cm[!#*1ZK'`B!J
+[#Lm$6VS6%#pA!"aB6dcI"!JJAdr[!!a1d&92)'m!"L*[!!S`+3!#X'J!!QBb)'m
+!"L*[!!S`+3!'X'J!"QBJ)'m!"L*[!!S`%E"3CK)JE`!')Qm!#M!T!!5`D!!%C`4
+`!'!#F!%I3!!"(fm!!3!19%mJAe"26Y")jai`6qrrcL4[!&3QE`"32#m!6L"51#J
+!&L"51LJ!&#"50LJ!%VC%E`SJ8M&%!")f"'!-YN9X##"5-88!%MB&,Va!!)!!3Um
+!"%*[!!J`!j!!46p!!!T)E`!+5'm!$Mmm)!kTkc!%8d!r3!!85'm!&%K[!"Jr2#!
+1UHX[I%!&lJ!!(N+[!#*#E`!Q5'm!&%K[!#)r2!!'UHY)E`!+5'm!)Mmm!!5TkdK
+A5'm!)Mmm!!#Tkbp[!"i!+#p[!#)!,$p[!#B!-&9298pC6dK[!$#S4#!I,`#SE$!
+I5-![!+KV-"mf!#m,F$V34Mm!3QG`5Y"'2`!r2!!1U+FN5c!U!!,33c9!!!)`+J!
+'d%-e3!!'6qm!-NcI$(JJAdr[!!T1d%MR(M"2lrqZ(#m!EN)[!"%[,`"b)&qJ+8S
+'C`!!eL"[!()N8&P25(J!6L!IS5)ZL#"I*8J!(#"U!"`J8$&U!")!4P92UC3`(b"
+U!"`J8$&!!%KC6kMB)&mLDJ!F)P%M5!!B@8qSf#"I)QS!(#*4)dJ!1&P2U0JJAb*
+U!"`L850)!#KC6kMB)&mLDJ!F)P%M5!!F@8qSf#"I)QS!(#*4)dJ!*&P2U0JJAb*
+U!"`L850)!#"C6kMB)&mLDJ!F)P%M5!!X@8qSf#"I)QS!(#*4)dJ!-&P2U0JJAb*
+U!"`L850)!$3JDJ!F)&!JUJ!))@S!$!!%)'m!FL"3,bJ!(#"IS#P96b"[!(3J8#"
+S!"`[%#"[!(JJ8%KS!!K1Z[eU%"pA`%3!'J!JE`"b)&!LE`"b)P%LD3!F)P%`+3"
+'X'J!%PE!4!!B!#4[!()N8P#+0LS!"J4$!03%3`!39%0+"QB+5J9Q"NS%C`!$DNS
+%Cf*+"QCH5J9Q@Kpm!!%!%5m[!(*)E`"12`01Z[eF)'m!FL43*NT3LdK[!%Sr+`!
+#F!,38cm!U+JJDJ!F)&![+!!`U0dJDJ!F)&![+!!`5'm!6UMI)'S!(#"3-@S!%J"
+'B!!$"#"[!()J8#*[!()L85*T!"`L85+S!!JMD!!-!!3JE`"b)&!LE`"b)P%LD3!
+F)P%cD!!5!%C)E`"#,c`!!Irr,c`!%3!2U+G)E`!kF!l33cm!2c`!!A!Hd%-r!$m
+m!"'STdK[!#*`(G"$2`!r2!!"F#h33cm!2c`!%DLR5'm!%R!Xd%-r!$mm!!&`20"
+$2`!r2!!4U+G)9h!ld%-r!$mm!!%`!`C!!-3r!$mm!"'STb"[!()J8#"S!"`J8#&
+A!!JKE`!%!!a)E`!D-!-'3!$$2`!r2!!"-!-'3!$62`!r2!!4U+G)E`!U-!-'3!$
+52`!r2!!"-!-'3!$L2`!r2!!4U+F[,`"b5'm!6Mm$6VVm##"[!()J8#"S!"`N8#"
+[!()J8#"S!"`J8%KS!""`!Y"[!%`r!$mm!!%`,`"%98!r!$mm!"'STb"[!()J8#"
+S!"`J8#pS!"!!-LpS!"3!0L"[!()Q8#4,8)T)E`"#2bS!!Mm5U+K)E`!k2bS!!Mm
+5U+K)E`!L2bS!!Mm5U+K)E`!52bS!!Mm5U+K)E`!D2bS!!Mm5U+K)E`!U2bS!!Mm
+5U+K)E`"+2bS!!R!#d&)r!+LS)'m!FL"3)'J!(#"35'J!#$mU!!)r%ULS)'m!FL"
+3)'J!(#"35'J!%$mU!!)r%ULS5'm!-MmU!!)r%ULS)'X!(#"3,bJ!'+MG)'X!(#"
+3,bJ!1+MG)'X!(#"3,bJ!++MG)'X!(#"3,bJ!)+MG)'X!(#"3,bJ!(+MG)'X!(#"
+3,bJ!*+MG)'X!(#"3,bJ!,+MG)'X!(#"3,bJ!-+MG)'X!(#"3,bJ!0+MG,fX!#!!
+),fX!$!!-)'X!(#"3,bJ!'%K[!!bShb"V!"`J8#mS!$K)E`"'U0mJD`!F)&![+!!
+S5'm!2UMI)'X!(#"3,bJ!)%K[!#DShb"V!"`J8#mS!"a)E`!@U0mJD`!F)&![+!!
+N5'm!(UMI)'X!(#"3,bJ!,%K[!#kShb"V!"`J8#mS!$")E`"1U0mJD`!F)&![+!!
+d5'm!0UMI)'m!FL"3,bJ!(#"IS#S[,`"b)&qJ+Kp[!"%!GNr[!&*-h`ai)&p36dl
+36qrrm#"[!"3ZN!![D!!%!!3II!"M!!`II!"[!!dII!"Z!!iII!"`!!pC6bm[!"!
+r,`!JU"mJAbp)!!K+V`!)Ca![,`!)5'm!"+Mf,bm!#+QM6qm!%#"IA%p1d#m+6qr
+rm#"[!"JZN!![D!!%!!4C6kMB)&mN5#m+U(T)9kKl,eF!##p[!!3!$$mm%j!!5'm
+!#Nkkrh"`"Y"[!!Sr!$![!!jE3$m!U*-r2!!"U)Fr2!!*U)Sr2!!"U)P#CkL),bm
+!(+L%98m[,`!HU)``(h)'dQm!#Y*!A%%r33!+-#m!$&Y!8d"E3$p!!!K)E`!)2bm
+!$Mm[!!j`#G"[!")r!$![!"*D3$m!U+Fr2"125'm!#Nkkr[)[#UKj,`USf8r[!"!
+NAb"I8%p1d%MR%$"2lrl`*'m"+#"[!53ZN!![D!!%!!4C6kMB)&mQ5#m,U(T)9kK
+l2c`6L5"5)'J!(#"3)'J!1#"35'J!!NkkrT`r2"16)&)JD!!F)&!JD!!S)&")D!!
+#6VVqJMmm%iSJ8L"S!"`J8#"S!#!J8%KS!!*1Z[jS2c`6Lb"5)'J!(#"3)'J!(#"
+35'J!!NkkrNir2"1-)&)JD!!F)&!JD!!N)&")D!!#6VVq0$mm%idJ8L"S!"`J8#"
+S!#`J8%KS!!*1Z[iD)&)JD!!F)&!L8M!T!!k`D!!5E3!!VNS[!5"R3L"5)'J!(#"
+30LJ!4M"$)!K6J1'))&)JD!!F)&!JD!"!dF"$l`!))$`!!!%!SLj)E`!))&)JD!!
+F)&")D!!36VVq&L"5)'J!(#"3,fJ!%!%),fJ!&!%--#m"#PG!2d!"#M![!3T@3$p
+!!3ir2"145'm"#NkkrBJJ8L"S!"`J8#pS!"!"##pS!"3"$$p[!3i"#M![!3T@3$p
+!!3ir2"155'm"#Nkkr9K+,`%LCbir2"1))&)JD!!F)&")D!!)6VVp2Mmm%iiJ8L"
+S!"`J8#"S!$!J8%KS!!*1Z[dN,`ZSH5m,U0P2l`%360m-##"I6qm!$%l388mJE`!
+-,T!!,fJ!"!!%5&HSF%K[!!5SF#"[!"!JPb&[!!3!"&"2,Tp1G8MR(L!NE`!H1Lm
+!($`[!"Si,`!B0JCJ),T$CJ`[#Mm$(c`!!DP&B!J[#Mm$3LHT43a$IrpR"P*$YN4
+[h%cI"(JJAdr[!!T1d%MR($*2lrrJ1Lm!5KJ[!%3QE`"!*'m!2#"[!&![8!!B,fJ
+!"!!F5J4R"MBm!+9J!RB55&G)E`!F6VVr9#p[!!3!(#p[!!J!)%S%@%pR2NK[!!k
+SG$(&#kC+,`"'C`j)E`!5UNJ[,`!5U(0J$%K[!!UT%#m[!!USFcm&U)Fr,`")U)S
+[#cm55'm!(+P$,`Xr%Mm$U83[#cm52c`!!992,`ZT8$!I2`"1Z[m36Hm!'&P2,`X
+`&Y"[!&3r!$!Z!!,3E`"B2`!r%UJ,)"mQ!%S%Caa#H!ZQ3QHSKd*RU)S[,`!1U(-
+[#cm52bm!(+P%5S0@`%3!(d!!#8U$C`T96bm$U'X`(c5!(fm!#3"86qm!)%cI6$J
+JAdr[!"K1d%MR($"2lrlU+Lm",P92UC3`(cJ!)'m"-L"3)'J!(#"32bJ!5+QB*'m
+"-L458)Sf+J!'"%-!e!4$!""83e92,bm"0%*R3LG1Z[Bm%"pR8L"[!6)J8#"S!"`
+J8$pS!%B"&$"[!43J#&1!iBJJE`%b)&!JD!!F)&!JD!"!dF"$l`!8)$`!!!%!SLj
+)E`!8)'m"0L"3)'J!(#"35'J!%%kkqcS[,`%b)&qJ+5"[!6)N8#!&6VVcU!25!!!
+!&!!!!)%!"`!!!"3!,!!!!"8!HJ!!!"i"'J!!!"m#DJ!!!#!$"J!!!#%$9!!!!#)
+#X!!!!)%!UK!U!"&b!")!$%%!&'BQ-#S!%V"U!"4[($mm%ldJDJ!F)&!JD!!F)&"
+)D!!#6VVkB'!!!j3[,`%b)'S!(#"3)'J!(#"35'J!!N)R3LG1Z[YNB!!$G"!U!"&
+b!")!$%%!&@BQ-#S!%V"U!"CX($mm%liJDJ!F)&!JD!!N)&")D!!#6VVk$'!!!d!
+[,`%b)'S!(#"3)'J!*#"35'J!!N)R3LG1Z[X3B!!$)"!U!"&b!")!$%%!&@F1%#S
+!%A)!%J!-33!8CKi[,`%b)'S!(#"35'J!#"mm!!%I2!!"6VVkeQ!!!ZB[,`%b)'S
+!(#m3(c`!!8)R6VVk[Q!!!Xi3+J!4FJ!5!!a"!"jQ!!+q)'S!(#"35UJ!2'F!!V"
+)9kPb2fS!%J%8,bS!(#"IS#NJDJ!F)&!JD!!d)&![D!!#!!`[D!!'!""96dK[!!i
+`,`!)N!"[!"4C3$m!,c`!!`!#2c`!#5"U!"`J8"mS!%9#*b"U!"`J8#mS!$a)E`%
+U6VVmI"!IC`!!a$!U!"+`E`%8C`!!Z$9[!43!%L"[!6)J8#"S!"`J8$&[!43!4Lm
+[!6*)E`!)2`01Z[,%*NT3LdK[!!3r+`!#F!,38cm!U+JJDJ!F)&![+!!`U0dJDJ!
+F)&![+!!`5'm!#+MI,bm"-L"[!6BJ8#"S!"`J8%KS!!JI2!!"(c`!!8kkqE!`E`%
+8)!K6J1'))'m"-L"3)'J!(#"3)'J!30(!3qm!&#!m!!!"!+)Z5'm!&#"[!6BJ8#"
+S!"`J8%KS!""1Z[LQ,bS!(#"IS#TJ!!&i)'S!(#"35LJ!4'F!!@S3+J!4FJ!5!!a
+"!"pQ($mm%lXJDJ!F)&!JD!!i)&")D!!#6VVi$'!!!8![,`%b)'S!(#"3)'J!1#"
+35'J!!N)R3LG1Z[N3B!!")"!U!"&b!")!$%%!)QBF2c`6`#"U!"`J8#"S!#JJ8%K
+S!!*1Z[I#B!!!pLm[!6)JDJ!F)&!JD!!S)&")D!!#3LG#*dkkq-CJ!!$@%#S!%A)
+!%J!-33!JCLB`+J!5X'S!&'mF2c`6[#"U!"`J8#"S!#!J8%KS!!*1Z[GZB!!!SLm
+[!6)JDJ!F)&!JD!!J)&")D!!#3LG#*dkkq(*J!!##%#S!%A)!%J!-33!KCL3`+J!
+5X'S!&Q`D2c`6[b"U!"`J8#"S!#`J8%KS!!*1Z[FDB%i[,`%b)'S!(#"3)'J!,#"
+35'J!!N)R3LG1Z[JJB$"+K@BB,bm"-L"U!"`[%"mm!!%I2!!"6VVi"'!8,bm"-L"
+U!"`[%"mm!!&#*dkkpqi[,`%b)&qJ+Mm%UCK2l`%@60m-1#"I8%p1d#m+A8p96kQ
+8-"mqJ#"[!")J8#"S!"`J8$mS!%LTQ#m[!")JAk!T)'m!%L4398m[,`!3)'S!(#"
+3,bJ!-+MS%"pR(Lpm!!!!J3!#)'m!%L"3)'J!(#"3)@m!$J"+B!!"(&92,bm!%#"
+U!"`J8#mS!#LSk"!IC`T`)Lp!!!*J!!$m98m[,`!3)'S!(#"3,bJ!(+MS%"pR#R!
+8,d!!!Q!!!0a96bm[!"!JDJ!F)&![+!!NU1J3(fF+F"8[3!!#B!!![&92,bm!%#"
+U!"`J8#mS!$5Sk"!IC`T`(Lp!!!*J!!#F98m[,`!3)'S!(#"3,bJ!1+MS%"pR#(!
+I,d!!!Q"m98m[,`!3)'S!(#"3,bJ!)+MS%"pR#(!J,d!!!Q"H98m[,`!3)'S!(#"
+3,bJ!,+MS%"pR#(!K,d!!!Q"!98m[,`!3)'S!(#"35'J!#+LY%"pR*L"U!"`J8#"
+S!$!J8$![!"#`D!!%E!K`&#p!!!*J$(!9,d!!!Q!%3Um!!Lm[!")JAk!U2aHTQ#p
+[!!)!&Pa2*&mJAe"26Y"C6bm[!!`JAk!T)'m!$#k3!#m[!!LSh5"A)'J!(#"3,fJ
+!'!!),bm!$#"IS#TB6b"I8%p1d&92,bm!$$m[!!SI2!!"6VV[fK!I)&p2l`!+6Y"
+)jam`6qrraL4[!&SJE`"H,e!!-LpS!!3!0LC58)Xf+`!'"%-!e!4$!""83b"52LJ
+!&L"52#J!&$S[!$3J8MJS!!VB3ck'5&G)E`!%2c`J$URV,ha!"Hi!!!T#V`!13Qm
+!%M!(8d!r3!!85'm!&%K[!"Jr2#!1UHY)E`!+5'm!'$mm!!DTkc!&N!"%"%!!3&K
+!2d!!(NK[!"j)E`!L2c`J$URV5'm!&%K[!#)r2!!%UHY)9dK[!#)r2!!!UHX[E`!
+H!#J[E`!L!#`rE`!Q!$"96e92@8p)E`!`U%3J(bm!U'``(dM!,`#SDc!I1!!J8L"
+S!"`J8$&%!%BJ8M&%!")[#NK[!$Br!dkklDK)E`!b)&)r+!!+)&*`!Y"S!!Jr!+L
+S)&)JD!!F)&![+!!`U0dJ8L"S!"`J8#mS!$")E`!fU0p2l`!k60m-q#"I8%p1d%M
+R(L"2lrlN,bm"1#"IS#NJE`%i)&![+!!F)&qJ+992UC3`(c`!)'m"1#"3)'J!(#"
+32bJ!5+QB)'m"1#"3)'J!(#"3,fJ!5J!))'m"1#"3)'J!(#"30LJ!4L"[!6JJ8#"
+S!"`J8#"S!$!J8#pS!!)"&#pS!!B"'#"[!6JJ8#"S!"`J8#4S!$!JE`%i)&!JD!!
+F)&!ZU!!),fJ!$!!%5&F[22r1rq+SU5"[!6JJ8#"S!"`J8#pS!!J"$#pS!!`"%$!
+[!!U3!'m"&Y"[!3j53$p!!3i`,`%DN!"[!!Sb,`%5NN!r33%5@8m[#Lm[!"")E`%
+B5'm!%$mm!!&)H!!!U38J(bS!98m["DKV-"mi!#"[!6JN8!a%XH"[!!#@5'm"&$m
+%3QHSU%K[!43[,`%m6VVpK#"[!6JJ8#"S!"`J8,CS!%CR!!$!,bm"1#"[!6`J8#"
+S!"`J8%KS!!JI2!!"(c`!!8kkmc`JE`%i)&!JD!!F)&!f+!"'-%-J#&1!iBJJE`%
+i)&!JD!!F)&!JD!"!dF"$l`!-)$`!!!%!SLj)E`!-)'S!(#"35'J!%%kkmLTJ9#"
+U!"`J8#mS!$#Sh5"U!"`J8#mS!$")E`%BU0m`3b!)8i$KL#"[!6JJ8#"S!"`J8#"
+S!%$4`%2[!!`J2!!!!3#L,NK[!!`JDJ!F)&")D!!36VVae#"[!6JJ8#mS!"`JAk!
+U,bm"1#"IS#Sr"UQB6qm"(%cI"(JJAe"26Y!!N!`e")5!!!!!"63Z1#id+$3Z1#i
+d)+Na16Jf,6%j16JJ4h*PC@iJ6@peER4KD@iJ8fpQG(GKFQ8!!!!U")5!!!!!"63
+Z1#id(8423deKDf9b)&0dB@jN,8&XEfjP)%4[Bh9YC@jd!!!!RJ!4$d&LEh9d)%4
+23deKDf9bb34'D@aP#e"KCf8J8f9dGA$*#&"bD@jdb5p3$NpeG("eG#"8CAKdb5p
+2"dCTEQ6*,dB-4QPZC#""Cf&TELp(#e4bB@jcCQ9bb5p8"P&eDA3[834&C'Pd"&9
+ZC'm$3h9d"%0[F(N&8'&cG'8&3faPBA))3fpZG'9ZG(-59'&LE'8J6fBJ3fpZG'9
+ZG(2*!!!"Z`!F$90KGQ8J9%9B9#"8EmN29(*KER0QCA)JGfKPFQ8r#&4bB@jcCQ9
+b#&"bD@jdD@jR%P"bD@jdD@jR)%4[Bh9YC@jdb3T3FQpMCA0cD@jR&&"bEf0PFh0
+TEQFJ4'pMG@ePER6*(P0`EfpXD@jR)(4SC5"NEf0eE@9ZG#"dEb"NDA0Vb3a5CA"
+KCfPZBA4TEQF%8'&RC6G%Eh9LE'8YBfaTBfXJB@iJDA4PE5"[FL"cC@aPBh3JB@i
+JDA4PE5"KEQ3JF(*PFh-JFQ9dGA*Z$%C[Eh4PFL"*EQC[b3K6C@aPBh4PC!*[CQY
+0C@e[FRNJDA-JGQ9bH5"XEhFZ)#"CEh8JFfK[G@aN)'PZBh*PBA0P)'ePE@pbH5"
+cDATP)'PZ)(4SC5"'D@jNCA)J+'0SEfpcC5$54f9d)%PZCQr6)(9ZC'9b)(4SC5"
+'D@aP)%ePER8T,JG$D'&`G'9b"5jdCAKd!D8%4QPZC!j3E'9KFf8JE'pMBA4P)!Y
+$E'pcC5"0EhCTC4C6D'ph)&4KBQaP)%pQ)%0[ER4PER4c&NKTC'8J9'&LE'8J6fB
+J3fpZG'9ZG(-"dJ(6!5i"1J%k!!!#+J)U!-X!*`$S!*J4!D!`13%!#J#3"!&@!J#
+B!"!!b`!J!1J!Q!$,!#F!k!#B!-X!*`$S!*J!!!i+!Iq!2!(Lr!2`!(lm!!i+!Ir
+!r`Iqr!2`!(lm!!i+!(MKjimq2!2!!"lm!!i+!(KK`iiH2!2!!"lm!!i+!(Kc`pi
+12JI!!"lm!!i+!(Kc`pi12JI!!"lm!!i+!(Kl`pi'2JI!!"lm!!i+!(Kl`pi'2JI
+!!"lm!"%2!(Kl`pi#2`r$i"jrM`r-!"%2!(Kl`pi#,`[(q"jr[mrH!"%2!(Kl`pi
+#,`[22"iHHH2c!"%2!(Kl`pi!,`[2("iFF12R!"%2!(Kl`pi!,j[2(KiBm22[!"%
+2!(Kl`pi!*j22(Ki`m222!"%2!(Kl`pi!*j2'(KiJm222!"%2!(Kl`pi!*j2!rKj
+Jm222!"%2!(Kl`pi!*r2$rKjJm22'!"%2!(Kl`pi!)q2(RKl`rr2!!"%2!(Kl`pi
+#)q22(Kl`rr2!!"%2!(Kl`pi#)q21(Krim!2!!"%2!(Kl`pi#)q2H(Kpim!2!!"%
+2!(Kl`pi#)F2H(Kpmm"2!!"%2!(Kl`pi#)F2H(Kimm"2!!"%2!(Kc`pi')F2H(Ki
+qm"2!!"%2!(Kc`pi')F2H(TiHm$2!!"%2!(KK`ii%))21(TiIF#2!!"%2!(MKjim
+-F)222ji2H12!!"%2!Ir!r`Iiq)rhlrqrrmr`!"%2!Iq!2!(`q)raahqrc`r`!2m
+!!!!&"%CTE'8!!!!&"&&eDA3!!!!V!!%!N!Mrrrrl!4323@*[GA3J4%p$6@&VCA,
+*!*!%!5d!N!K)!!-!N!E,e2rrrrX%4@4TG!49EQ4[!&S!!!%Y!*!%!d0eG!"B!!!
+%3fp`H3"$!!!&8'&cG'8!9J!!"80XC@&b!*!)&!!#!*!)rj!%"%CTE'8!N!3c!!3
+!N!Mrrrrl#%0[ER4PER4c&P0SEhFJ9'&LE'8J6fBJ3fpZG'9ZG(-!5`#3"3%!N!V
+rN!8!N![rN!8!N!JMN!!M$`J)$`#3"%H3"C!!N!-)#!K(4dF!!04NC'53!*!$#2m
+)#'4N4`!!e'4NN!#3!`m)r`J)C'4(!!$8C*'3"!m2r`m)C'4(!!$8NC!&$`rr$`q
+4C%F!!04NNC!&$`m2NC'44`!!e'4NNC!&rj'4N50(!!$8C'4NNT!%rj+5C'4(!!$
+8C*!%NT+5rj*NC'4(!!$8C*!&NT+5C*!%4`!!e'53"T*NN!9(!!$84j!0!!$8N!d
+!N!@!!*!%$rrr!*!&$rrr!*!%0c,-)!!$-c0hI-`c-!DlYhI2c,X`"VYhFXr-Zc!
+'YhGb,bbl-!ChGh)[)RX`"VGhGb)RGc!'ZhGhIhGc-!DlYhGrGlX`"VZlGhplZc!
+'ZlZhGlZl-!DlZlYlZlX`"M13"M!'CT!'!*!%3!"m!(`$b(k1I8jl6R2ZBrjapRM
+ZI&jqIRpqIrjrrRrm!(`!I!2iIrjrrRrqIrjrrRrqIrjrrRrqIrjrrRrqIr`!!!#
+!!!'!!!!#3!$rrrrmJ!!!")!!!!D"(()'J4*+"S+55JD#R()'K&"#"SI33JD%8%2
+'J!!!"S!!!!ErrrrqrrrrrUUUm(p&9F!c)UZB&K&@*!`)[rr'"&BB!`)VJ!-"&F!
+$!)T`!`"&Vr-!)NBI!"'-!!!)'!!!"$!!!!*J!!!"`!#3")!!N!RrrJ!"J!-!!cr
+jJ!Crr-!-rrjJ'Irr-$2rrjJRrrr),rrrl#rrrk`[rrmX,rrr,#rrrb`[rrmX,rr
+r,#rrrb`[rrmX,rrq,#rrr'`RrrM--rraR"RricJ-m!C`"Q!-i!-rqF!"J!1!!2r
+r!!!rrJ#3$)!!N!8$!!!!"i!!!!I!!!!-i!!!#f!!!"Y`!!!AX!!!0lJ!!#rB!!"
+Xh!!!@'`!!0KZ!!#iGJ!"Z(F!!AKl!!0iHi!#q(f!"[Kp`!AiIX!0q(lJ#rcrB"[
+rrh!Ar2q`0rKrZ#riIpJ[r2rF,rrrh$!!!$`rrrrm$rrrq!#3"i$rrrrqJ%!!!S"
+IrrU!ArrlRerrqi![J(ZI,`!lKLjlQi!Z!"Z!,J!EJ#lqfi!Z!"Z!&J!EJ"B!'i!
+@rlZ!&J!EJ"B!'i!@[GZ$&J!EJCB!'i$fFcZ!MJ"lJ,i!qi#i$rZ2S2rlKMrrqi0
+rrrZ"IrrlJhrrqri!!!2rN!3Irrrr!!!!J2rrrrk!3!!#J&rrqS"IrrZIArrlJ#q
+!Hjm[!$Z',J!EJ#i!'i!Z!!Z!,!),J#`'#i!8#JZ!&"i,J"3L#i!8C`Z!&!!,J"3
+!#i-@!"Z"PJ!EJ2B!1i#1!(Z![J$lJ,J2qiqJrrZ'2rrlJhrrqi&rrrZ$IrrlrJ!
+!!rq3""rrrrm!!!%!N!FIi!!!(k!!!"rJ!!-33!!%S%!!#%#!(r#!q"!K%)Jh`K$
+S0iB3k$F'%1Jf"M$S0!CBk$J(@@Jd"c%S-J1L'$8"j"JfJ2JS0d!`5$HJ%+Jhd"&
+S0qJ5k$Id"HJhqJ[S0rdAk$IqVqJhrerS-!!!#$rrrrJrrrrJ!*!+(q!!!"rJ!!!
+Ii!!$(m!!"lr!!!rrJ"rrrrJIrrri2rrrq$rrrrJrrrri2rrrq$rrrrJrrrri2rr
+rq$rrrrJrrrri2rrrq$rrrrJrrrri2rrrq$rrrrJrrrri2rrrq$rrrrJrrrri2rr
+rq$rrrrJrrrri2rrri!#3"J3!N$6rN!J!N"MrN!B!r`#3'2q3#!#3%b-M!!!!$`L
+3"3m!N"-MN!#3!#-!$`L3"Jm!N")MN!#3"!m)N!B2!*!+4j!))j!!N!32#*!($dH
+3"!#3"NF!N!BMN!#3"!m)#!Mr#*!%$`!!!%F!N!A84`"NN!3MN!#3"!m)N!6r#*!
+%$f4N!%F!N!A84`"NC'3MN!#3")N2#*!%r`L3"!pNC!"(!*!&e%F!C'3MN!#3"BN
+2#*!%r`L3"!pNC!"(!*!&e%F!C#14N!D*$`J)#!rr#*!%$f4N!%F!N!A84`!MNC!
+(L3m)#!q4r`m)#!J2C'3!4`#3"G4()j'3#)N2$`J2NIm2#!J2N50N!%F!N!A84`!
+MNC!(L3m2#!J2$`J)#!q4N5-!4`#3"G4(!!!MNC!(L3m2#!m)#!J2NC!%)dF!N!A
+84`"N!#14N!H*$`m2#!J2NC!&)dF!N!A84`"NC!!MNC!(LBQ*r`q4N!8M!%F!N!A
+84`"NC'3!)j'3#)RrNC!&)`!!4`#3"G4(!'53"!!MNT!)rj+3"#-!C!"(!*!&e%F
+!C*!&!#15N!IrNT+5)`"NC!"(!*!&e%F!C*!'!#15N!ErNT)M!'4NC!"(!*!&e%F
+!C*!(!#15N!FM!'53"!"(!*!&e%F!C*!)!#15N!8M!'53"3"(!*!&e%F!C*!*!#1
+5NT)M!'53"J"(!*!&e%F!C*!+!#15)`"NN!F!4`#3"G4(!'53#`!M!'53#!"(!*!
+&e%F!N"K(!*!&e%H3'J#3"G53'3#3*`)!N"S2rrrrm!#3#`rrrr$`!*!,$rrrrr!
+!N!Nc!!,-c-)!N!N$Gc!Xc-c#!*!*0hGbc-c-)!#3"!-cN!4hGbc-c-`M-c!!!!-
+!!!!hGh,-cmc-)!!`!!"M#lZcGhFXc-r-c#Z`-!!!B`Zl0hGk,-c2c-`VX$!!!'-
+,XhGhHLc-cmc-+l!`!!"M#cGhGhSXc#r-c#Z`-!!!B`0hGhGk,-*r,-`VX$!!!'-
+hGhGhHL,#Ibc#Fl!`!!"M!hGhGhSLc#,-`RF`-!!!B`!hGhGhSL`Xc#GhFc!!!'-
+,!hGhGhSL,-*hGh-`!!"M#l!hGhGhUUmRGhF`-!!!B`Zl!hH3"+phGh-!-!!!B`Z
+lX$GhGhGrGhF`X$!!!'-,ZlX$GhGhIhGc#l!`!!"M#lZlX$GhGhph-,Z`-!!!B`Z
+lZlX$GhGhF`ZlX$!!!'-,ZlZlX$GhGc#lZl!`!!"M#lZ3"!0hF`ZlZl!`!!"M#lZ
+3",!h-,ZlZl!`!!"M#lZ3"3-,ZlZlX$!!!'-!N!``!!"M-j!--!!!CT!-B!#3&3G
+"8&"-!*!'&J"k!)S!f!(3!!%!N!R)!9J!!!!@!#B!(!$Z!9S!!3#3#B3"@!!!!"B
+!*3!1!2X"@J!"!*!*JJ&B!!!!'3!Z!!B!M`%j!!3!N!J"-J4'D@jN!!!#B!!r!#F
+!m!'R!!%!N!J,Z!#3"3B!QJ#GL0FJ8h4KEQ3J3@a[EQ8J4'pMG@ePER3J3h*PBA4
+[FJdJN!PhFQPdG'9Z)'*j)%eKFQXJ9f&XE!dJN!fT-6Ni0L!Y)$%j16F0)%&XE#"
+5D@GSG(-J8Q9cCA*fC@3J9fpbE'4hD@4P$3dJN!C(FQ9PEL"0Eh9ZG'&TEL"6EfC
+dGf&bC3dJN!Bj0$!d)&CKE'aPH5"-B@jP$5#3"NKeER4cGQPXE'8X)%&-$5#3"M-
+e1$!c,6%c-MBJN!498d%#!*!&#`#L!%X"GiME4%p$6@&VCA)JDA-JB5"cD'&bCAG
+KFQ8JF'&MDf&RC5"QEh)JBh*PBA4TEQFJFh4KEQ3YB@a[EQ8JC'pMG@ePER4c)'C
+[FL"MEfe`GA4PFR-JFR9ZEQPZCb"eEQ4PFL"0B@028kSZ)#"8D'8JC'pMG@ePER3
+JH@pe)'&bC5"bC@&ND@jR)(GKFb"MFQ9KG'9N)(GTG'JJ4%p$6@&VCA)Z)#"$Efj
+dB@0d)%GbC@9Z)%e[G@jdB@PZ)&0[CR4hBA*P)'C[FL"XD@0PER0TEQFJD@jQEh*
+YBA4TEfiZ!J#3"8m!SJ#S!AZ)@N&26$SJ)%e69d&-6!eRFQ9PEQedEN"SFhBZG'P
+c,QjPG!eSG(4`1Lm[GhGh,QKcGLjdDA-ZEQ9d,hjRFQ9PEQedELm0GQpTBf8[4N&
+B)$)`05ii1$-Z-$-h-`#3"Ci!"J#X!&Q)#(Bd,MFZ-Q3e!!!!6!!#!*!&#3!+!"N
+"3)J#AM!!N!8J!!S!3!&!L!*H-3#3"88!6J"A!3D)(&"bCA0c)#J4)#"`CA*TEf3
+T)(4[)'0KEQ0PE#i!!!#b!!F!N!@[!28!``%`"!*25`#3"Dm!V3$$!1J%"N0KEQ0
+PE!#3"Dm!9`$$!+!%#9"bD@jd)%&XE%m!N!8H!!S!-J"Q"!T6C@aPBh3J3@aX!*!
+&03!*!+J"-!#3"ai!E!!b!5@)#90PE'9MG'9N1J%!N!8&!!S!&`%QL"P6C@aPBh3
+J3fKKF(4PFR-J9'mJ8(*TER6*l3#3"4N!#J!E!6#%!*!%[J!#!*!&#3!&!#N!*D!
+#!)!!N!93!$)!dJ&*!*!("J!X!%J"4SL3!&4SDA-JC'pMG@ePER3JGf&c)'0bC@&
+dC@3JGA0TEQFJCQpZG(-JGfKTBfJJBA*P)'j[G#"KGQ&TE'&LE'8JEfiJG'KTFb"
+0B@0TER4[FfJZ$8&XG'9bEQ&dC5"QEfjdFb"hD@aX)'*P)(9cC@3JD@iJF'aKBf8
+JEfBJG'KP)'C[ER4c)'aTFh4PC#"SCA*P1J!!!))!"3#3"8%!#J"9!%X%"%CTEQ3
+!N!9"!&m!93#J"!4%EfjP!*!&#J!Y!"S"*a!!N!BM!!S!03"V"3T0BA4MD#"$BA0
+P!*!&)`"Z!$8""3868f9KFQ0S)%&XE#"$D'&`G'9bF`#3"JS!#J!E!#U)"8CTEQ3
+k!*!%+!!"!*!&@!%3!'`"5`3#6dX!N!8(!%S!5`&,L!KH-&iaAM*H-`!!!P`!"!#
+3"3B!'3!M!)V!!J#!!*!&+!!)!*S!RiMA)&0dB@jN)%&XEfjP)%4[Bh9YC@jd)%0
+bC@&dEh)0)*!*Gh*TG(4PEL"LH5"0BA*V)&GKE'`0)*!0U6%j1$BJ,5!a16Ni$5"
+"E'`J8QPRD(4c)&*PFf9bGQ9N)&G[FQaNGfPNC3d0)*!'4h*PC@iJ6@peER4KD@i
+J8fpQG(GKFQ80)*!'163`0#"@B@aXCANJ6'&ZC3dJN!C)G@jdFhCTE'aP,#""6!d
+JN!Bc06J`-bda-c)f)*!%990"!J#3"3X!SJ",!AH)fN423deKDf9b)'Pc)'%JFfp
+QG(GKFQ8JF'&MDf&RC5"QEh)JBh*PBA4TEQFJFh4KEQ3YB@a[EQ8JC'pMG@ePER4
+c)'C[FL"MEfe`GA4PFR-JFR9ZEQPZCb"eEQ4PFL"0B@028kSZ)#"8D'8JC'pMG@e
+PER3JH@pe)'&bC5"bC@&ND@jR)(GKFb"MFQ9KG'9N)(GTG'JJ4%p$6@&VCA)Z)#"
+$EfjdB@0d)%GbC@9Z)%e[G@jdB@PZ)&0[CR4hBA*P)'C[FL"XD@0PER0TEQFJD@j
+QEh*YBA4TEfiZ!*!&6`#L!+J"HiKD38p-1L!J690A38a-$@GbC@9ZEA4Z3'KcGLj
+dDA-ZEQ9d$@KdG(!k,bphGhFZD(0f,R4TFbjZCA3[IQGbC@9ZEA4Z,`efEfPMC5p
+'39JJ-M8f,MJi-bi`-cFc!*!&RJ!'!+`!@BJ'GM3Z1#id!!!!'2rr!Ed"(3(0!*!
+%!C!!!!!!%!#3"!&i!!!!'!"N!$)!I3"e!!%!!!!+!!%"i!#3"!&K!!!!(%4V3&!
+!!!!"4P*&4J#3"B"*3diM!*!&J!!!!!`!,J"!!+3"P3#"998!!!&N!@3!N!83!"!
+!%3,r$!$rN!3!N!N3!!!!%!#3"k!!JJ!H!!%!#J#3"4!!%!#BJ"!!N!83!"!!N!P
+)!!!!5!#3"3J!!3!)!*!&k@!d!*!'&0B!!!!%!!$rN!B!!Gf3"J!#Gj!'!!-LN!B
+!r`#3#a!!%!#3"4!!%!!!![(r"`$rp!!"![m)!Im!p3%"![m,![m!!IJ$!`%"![m
+2"Im!!3-#!2`#"!-"!3,r#`,r!!(i!`-"!3,r$`2r!!%$r!!'!J)$!3%#r`i%r`!
+"!`$l!J3$!3%#r`m$r`!"!r`!"J)#!`%"![m1"2m!!3-!q`)%!`%"![m2!rm!!32
+m!!B#!J-"!3,r#`,r!!(i!`-"!3,r#!(r!28"!3,r#!(r!28"!3,r"J$rm`)!r`,
+ar`#J!)-!r`!!!AS"HJ#3"4!!%!!4![m-!2q3"!#3#4!!!!!3!*!(S!##!"i!!3!
++!*!&%!!3!*L!%!#3"4!!%!#3#8J!!!")!*!&#!!"!!J!N!ATCD`!N!B9Y!!!!!3
+!!2q3"J!"hC!'!!*hN!B!!b+3"J$r!*!,%!!3!*!&%!!3!!!#mIm(!2rd!!%#r`J
+"r`$e!3%#ra!%r`!"!!2p!3%!!ri"!3,r%36r!!%!!ri"!J!$!ri"!3,r%!Ir!!%
+!!`%"!2i$rJ%"![m2"[m!!3!$!3$p!ri"!3,r$JAr!!%!!`$m!ri"!3,r$`Er!!%
+!!`%!r32q!3%#ra!(r`!"!!-"!3$q!ri"!3,r%36r!!%!!ri"!J!$!ri"!3,r%!6
+r!!%!!rd"!3!$rJ%"![m)!Im!p3%"![m)!Im!p3%"![m'!2rc!J$r![(r!!#J!)-
+!r`!!!@B"CJ#3"4!!%!!4![m-!2q3"!#3#4!!!!!3!*!(S!##!"i!!3!+!*!&%!!
+3!*L!%!#3"4!!%!#3#8J!!!")!*!&#!!"!!J!N!ATD"!!N!B@5!!!!!3!!2q3"J!
+"hC!'!!*hN!B!!b+3"J$r!*!,%!!3!*!&%!!3!!!#mIm(!2rd!!%#r`J"r`$e!3%
+#r`d"r`$l!3%!!rd"!3,r$J(r!2`"!J!$!rd"!3,r$J(r!2d"!!$q!rd"!3,r$J(
+r!2i"!!$p!rd"!3,r$36r!!%"!2`$r3%"![m1!Im!rJ%!!2d$r3%"![m1!Im!r3%
+!!2i$r3%"![m1!Im!r!%#!!-$r3%"![m0!Im!q`%"!!2p!3%#r`J"r`$e!3%#r`J
+"r`$e!3%#r`B!rr-#!2m#mIm!S!#$!2m!!!&H!9i!N!83!"!!%3,r$!$rN!3!N!N
+3!!!!%!#3"k!!JJ!H!!%!#J#3"4!!%!#BJ"!!N!83!"!!N!P)!!!!5!#3"3J!!3!
+)!*!&k@(d!*!'&iF!!!!%!!$rN!B!!Gf3"J!#Gj!'!!-LN!B!r`#3#a!!%!#3"4!
+!%!!!![(r"`$rp!!"![m)!Im!p3%"![m-"Im!!3%!!rN"!3,r$3Er!!%"!!-$qJ%
+"![m0"2m!!3%!rJ2l!3%#r`d%r`!"!3$p!r`"!3,r$36r!!%"!2`$r3%"![m0"2m
+!!3%!r32m!3%#r`d%r`!"!3$q!rX"!3,r$3Er!!%"!!-$qJ%"![m-"Im!!3%!!rN
+"!3,r#!(r!28"!3,r#!(r!28"!3,r"J$rm`)!r`,ar`#J!)-!r`!!!Ai"IJ#3"4!
+!%!!4![m-!2q3"!#3#4!!!!!3!*!(S!##!"i!!3!+!*!&%!!3!*L!%!#3"4!!%!#
+3#8J!!!")!*!&#!!"!!J!N!ATCU3!N!BB2`!!!!3!!2q3"J!"hC!'!!*hN!B!!b+
+3"J$r!*!,%!!3!*!&%!!3!!!#mIm(!2rd!!%#r`J"r`$e!3%#ra!%r`!"!!2p!3%
+!!ri"!3,r%3Ar!!%!!`2q!3%!!ri"!3,r%32r!!%!rJ-$!3%!!ri"!3,r%!2r!!%
+!r3-#!3!$rJ%"![m2!rm!!3$m!`%!!ri"!3,r%!2r!!%!r3-#!3!$rJ%"![m4!rm
+!!3$q!`-"!3!$rJ%"![m4"Im!!3!$!ri"!3!$rJ%"![m3"2m!!3!$r3%"!!2q!3%
+#r`J"r`$e!3%#r`J"r`$e!3%#r`B!rr-#!2m#mIm!S!#$!2m!!!&Q!@B!N!81!"!
+!%3,r$!$rN!3!N!N3!!!!$J#3"k!!JJ!H!!%!#J#3"4!!%!#BJ"!!N!81!"!!N!P
+)!!!!5!#3"3J!!3!)!*!&k@B8!*!''1m!!!!&!!$rN!B!!AH3"J!#)T!'!!1UN!B
+!"1k3"J$r!*!,$J!3!*!&$J!3!!!'!!(c!!!#"`%"!23$!!)(!3%!p!-!!JF"!3$
+d!`!#%!%"!2i$"33#"!)%![d$!!)4#`%!!`-%!J)%!J3#![i$!!)4!`%!!`6q!J)
+%!J6q!J)$!`)2!J%!"2d#!J3#"2d#!3-#%3-"!!-%rJ)#"!)%rJ)#!`-#%3X"!!-
+$"!)#"!)%!J,q!`!#%!%"!2i$"33#"!)%![d$!!)(!3%!p!-!!JF"!3$d!`!#![%
+#!+!!J`$r!!!!e!$8!*!&"3!*!"%#r``!rj!%!*!*#3!!!!8!N!HJ!))!(J!"!!S
+!N!83!"!!Q)!+!*!&"3!*!*!*5!!!!%J!N!8)!!%!#!#3"HPN3!#3"KQY!!!!!`!
+!rj!'!!(GN!B!!L+3"J$r!*!,"3!*!*!&"3!*!!!%q!)!!!F!!IS#!3%b#3%"!I`
+#!J%""!Mq!Ii#rJ%!$!Mp!3!#r3%!r`!!S!#$!2m!!!$5!0)!!!!,!"!!$3!4![m
+-!2q3"!!,!*!($3!!!"!!N!HJ!))!(J!"!!S!N!83!"!!N!#!!J!!!!X!%!!0!!!
+!!3#3"8J!!!")!*!&#!!"!!J!N!ATD&J!N!BXE3!!!!3!!2q3"J!"hC!'!!*hN!B
+!!b+3"J$r!*!*#`!3!!d!!!!,!"!!$3!!rrm!!!'3'!)#rrm!S!#$!2m!!!$b!2)
+!N!83!!-!%3,r$!$rN!3!N!N$!!!!%!#3"k!!JJ!H!!%!#J#3"4!!%!#3!)!%!*!
+&%!!$!!!!!3#3"8J!!!")!*!&#!!"!!J!N!ATBEJ!N!BVB3!!!!3!!2q3"J!"hC!
+'!!*hN!B!!b+3"J$r!*!,%!!$!*!&%!!$!!$rrrm"r`!!rrm!!AAr!!%!r`!"l2m
+!!3Mr!!&Sr`!"92m!!36r!!%$r`!"8rm!!@Vr!!%Jr`!"8rm#!Qcrrrm(!+!!J`$
+r!!!!mJ$b!!!!$3!3!"!!%3,r$!$rN!3!$3#3"a!!!!!3!*!(S!##!"i!!3!+!*!
+&%!!3!*!!J!3!!!!0!"!!%!!!!!%!N!9)!!!!5!#3"3J!!3!)!*!&k@GN!*!'+J)
+!!!!%!!$rN!B!!Gf3"J!#Gj!'!!-LN!B!r`#3#3d!%!!3!!!!$3!3!"!!!2rrr`%
+!![rr!3,r9!%#r`!"![r8!3,rD3%#rfm"![p[!3,rE!%#r`!"![pT!3,rC3%#rf-
+"![m!!J,r8[rrrh3!S!#$!2m!!!&L!@)!N!83!"!!%3,r$!$rN!3!N!N3!!!!%!#
+3"k!!JJ!H!!%!#J#3"4!!%!#BJ"!!N!83!"!!N!P)!!!!5!#3"3J!!3!)!*!&k@J
+m!*!'T'J!!!!%!!$rN!B!!Gf3"J!#Gj!'!!-LN!B!r`#3#a!!%!#3"4!!%!!!![(
+r"J$rm`)!r`F"r`,d!3$r"`(r![3"!2m,!rm#!3(i!`)"!Im2"[m#!3%$!J$m!J-
+$!3(r#`2r!J%"q!-#!3(r$`6r!J%"!r`!"3)#!`%"r`i&r`)"!3-!q`)$!`%"r`m
+%r`)"!32m!!8#!J-"!Im1"Im#!3%$!2X#!`-"!Im2"2m#!3%$r!!&!J)$!3(r#`2
+r!J%"q!-#!3(r"`(r![3"!2m(!Im#p!%!r`,ar`!!S!#$!2m!!!&f!AB!N!83!"!
+!%3,r$!$rN!3!N!N3!!!!%!#3"k!!JJ!H!!%!#J#3"4!!%!#BJ"!!N!83!"!!N!P
+)!!!!5!#3"3J!!3!)!*!&k@CF!*!'PpF!!!!%!!$rN!B!!Gf3"J!#Gj!'!!-LN!B
+!r`#3#a!!%!#3"4!!%!!!![(r"J$rm`)!r`F"r`,d!3$r"`(r![3"!2m3"Im#!3%
+!!rd"!3!$rJ%!ra%&r`)"!3!$rJ%#!!-$rJ%!ra!)r`)"!3!$!3%!rJ2q!3$r$`I
+r!J%"!!-"!2d$rJ%!r`i'r`)"!3!$!2`$rJ%!r`m(r`)"!3!$!3$p!ri"!2m3#2m
+#!3%!!`%"!2i$rJ%!ra%&r`)"!3!$rJ%#!!-$rJ%!ra!&r`)"!3!$r3%"!!2q!3$
+r"`(r![3"!2m(!Im#p!%!r`,ar`#J!)-!r`!!!9`"A!#3"4!!%!!4![m-!2q3"!#
+3#4!!!!!3!*!(S!##!"i!!3!+!*!&%!!3!*L!%!#3"4!!%!#3#8J!!!")!*!&#!!
+"!!J!N!ATCM`!N!DP53!!!!3!!2q3"J!"hC!'!!*hN!B!!b+3"J$r!*!,%!!3!*!
+&%!!3!!!#mIm'!2rc!J$r"`(r![3"!2m(!Im#p!%!r``"r`,k!3%!!rd"!2m0!Im
+#q`%#!!-$r3%!r`d"r`,m!3!!rJ2p!3$r$3(r![d"!!$p!rd"!2m0!Im#rJ%!!2`
+$r3%!r`d"r`,p!3!!r32p!3$r$3(r![`"!!$q!rd"!2m0!Im#q`%#!!-$r3%!r``
+"r`,k!3%!!rd"!2m(!Im#p!%!r`F"r`,d!3$r![(r!!#J!)-!r`!!!9`"A!#3"4!
+!%!!4![m-!2q3"!#3#4!!!!!3!*!(S!##!"i!!3!+!*!&%!!3!*L!%!#3"4!!%!#
+3#8J!!!")!*!&#!!"!!J!N!ATBi!!N!DQ,!!!!!3!!2q3"J!"hC!'!!*hN!B!!b+
+3"J$r!*!,%!!3!*!&%!!3!!!#mIm'!2rc!J$r"`(r![3"!2m(!Im#p!%!r``"r`,
+q!3%!!rN"!2m0!Im#rJ%#!!-$qJ%!r`d"r`,q!3!!rJ2l!3$r$3(r![i"!!$p!r`
+"!2m0!Im#rJ%!!2`$r3%!r`d"r`,q!3!!r32m!3$r$3(r![i"!!$q!rX"!2m0!Im
+#rJ%#!!-$qJ%!r``"r`,q!3%!!rN"!2m(!Im#p!%!r`F"r`,d!3$r![(r!!#J!)-
+!r`!!!A`"I!#3"4!!%!!4![m-!2q3"!#3#4!!!!!3!*!(S!##!"i!!3!+!*!&%!!
+3!*L!%!#3"4!!%!#3#8J!!!")!*!&#!!"!!J!N!ATAY`!N!DQaJ!!!!3!!2q3"J!
+"hC!'!!*hN!B!!b+3"J$r!*!,%!!3!*!&%!!3!!!#mIm'!2rc!J$r"`(r![3"!2m
+(!Im#p!%!ra!&r`)"!3!$r3%"!!2q!3$r%3Er!J%"!!-$rJ%"!!2q!3$r%36r!J%
+"!2i$!`%"!!2q!3$r%!6r!J%"!2d$!J%!!ri"!2m2"2m#!3%!r!-"!!2q!3$r%!6
+r!J%"!2d$!J%!!ri"!2m4"2m#!3%!rJ-$!3%!!ri"!2m4"[m#!3%!!`2q!3%!!ri
+"!2m3"Im#!3%!!rd"!3!$rJ%!r`F"r`,d!3$r"`(r![3"!2m#mIm!!+!!J`$r!!!
+28!p3!*!&%!#*!"%#r``!rj!%!*!*L3!!!"!!N!FH!!%!#J#3"4!!L3#BJ*!!!13
+!b3$d!9N!N!P)!!!!5!#3"3J!!3!)!*!')4!!N!F)J!!!r`J!rj!'#!$rN!6-c!J
+!rj!%QCN)!2q3"'CQ#!$rN!3c-`J!rj!%!!!)!2rrc-crr`J!rrr-N!3)!2rrc-b
+CQ3J!rrr-c'CQ#!$rrmc--c-)!2rrc-`!!!J!rrqCQIrr#!$rrjQCc-`)!2rrQC!
+%#!$rrjQCCQB)!2rrQCNc-`J!rrqCQ3!!#!$rrfCQrrm)!2rrCQE-c!J!rrpQCTQ
+C#!$rrfD3"!J!rrpQCM-c#!$rrfCQ!!!)!2rr-c2rr`J!rrmc-mc-#!$rrc-cQCN
+)!2rr-c0QCJJ!rrmcN!3)!2rr-c-!!!J!rrm!!2rr#!$rr`!!c-`)!2rr!!#CQ3J
+!rrm!!'CQ#!$rr`!!-c-)!2rr!*!%#!$-c2q3"!J!c-crrmc-#!$-c2rrQCN)!-c
+-rrpQCJJ!c-crrc-c#!$-c2rr!!!)!-b3"2rr#!$-N!B)!-b3"*QC#!$-N!4QCJJ
+!c*!%-c-)!-b3"!!!#!$-c*QCrrm)!-c-QCR-c!J!c-bCN!3)!-c-QCPQCJJ!c-b
+CQ6-c#!$-c*QC!!!)!-c-CQErr`J!c-aQCXc-#!$-c'CQQCN)!-c-CT!%#!$-c'C
+Q-c-)!-c-CQB!!!J!c-`c-rrr#!$-c$-cc-`)!-c--c1CQ3J!c-`c-fCQ#!$-c$1
+3"!J!c-`c-`!!#!$-c!!!rrm)!-c-!!$-c!J!c-`!!*QC#!$-c!!!CQB)!-c-!!!
+c-`J!c-`!N!3)!*QCrj!%#!#CQIrrc-`)!*QCrrqCQ3J!QCRrrfCQ#!#CQIrr-c-
+)!*QCrrm!!!J!QCR-c2rr#!#CQFb3"!J!QCR-c*QC#!#CQFc-CQB)!*QCc-`c-`J
+!QCR-c!!!#!#CN!6rr`J!QC!%c-`)!*Q3"JJ!QC!%CQB)!*Q3"$-c#!#CN!3!!!J
+!QCPQC[rr#!#CQ@CQc-`)!*QCCQDCQ3J!QCPQN!3)!*QCCQBc-`J!QCPQCJ!!#!#
+CQ6-crrm)!*QC-c2-c!J!QCNc-jQC#!#CQ6-cCQB)!*QC-j!%#!#CQ6-c!!!)!*Q
+C!!$rr`J!QCN!!-c-#!#CQ3!!QCN)!*QC!!"QCJJ!QCN!!$-c#!#CQ3#3"!J!CQE
+rN!3)!'CQrrr-c!J!CQErrjQC#!"QC[rrCQB)!'CQrrmc-`J!CQErr`!!#!"QCXc
+-rrm)!'CQc*!%#!"QCXc-QCN)!'CQc-aQCJJ!CQE-c$-c#!"QCXc-!!!)!'CQQCR
+rr`J!CQDCQFc-#!"QCTQ3"!J!CQDCQ@CQ#!"QCTQC-c-)!'CQQCN!!!J!CT!%rrm
+)!'D3"-c-#!"QN!5CQ3J!CT!'#!"QN!3c-`J!CT!%!!!)!'CQ-c2rr`J!CQBc-mc
+-#!"QCM-cQCN)!'CQ-c0QCJJ!CQBcN!3)!'CQ-c-!!!J!CQB!!2rr#!"QCJ!!c-`
+)!'CQ!!#CQ3J!CQB!!'CQ#!"QCJ!!-c-)!'CQ!*!%#!!c-rq3"!J!-c2rrmc-#!!
+c-rrrQCN)!$-crrpQCJJ!-c2rrc-c#!!c-rrr!!!)!$-cc-crr`J!-c2-N!3)!$-
+cc-bCQ3J!-c2-c'CQ#!!c-mc--c-)!$-cc-`!!!J!-c1CQIrr#!!c-jQCc-`)!$-
+cQC!%#!!c-jQCCQB)!$-cQCNc-`J!-c1CQ3!!#!!c-fCQrrm)!$-cCQE-c!J!-c0
+QCTQC#!!c-fD3"!J!-c0QCM-c#!!c-fCQ!!!)!$13"2rr#!!cN!6-c!J!-j!%QCN
+)!$13"'CQ#!!cN!B)!$13"!!!#!!c-`!!rrm)!$-c!!$-c!J!-c-!!*QC#!!c-`!
+!CQB)!$-c!!!c-`J!-c-!N!3)!!!!rj!%#!!!!2rrc-`)!!!!rrqCQ3J!!!$rrfC
+Q#!!!!2rr-c-)!!!!rrm!!!J!!!$-c2rr#!!!!-b3"!J!!!$-c*QC#!!!!-c-CQB
+)!!!!c-`c-`J!!!$-c!!!#!!!!*QCrrm)!!!!QCR-c!J!!!#CN!3)!!!!QCPQCJJ
+!!!#CQ6-c#!!!!*QC!!!)!!!!CQErr`J!!!"QCXc-#!!!!'CQQCN)!!!!CT!%#!!
+!!'CQ-c-)!!!!CQB!!!J!!!!c-rrr#!!!!$-cc-`)!!!!-c1CQ3J!!!!c-fCQ#!!
+!!$13"!J!!!!c-`!!#!#3"Irr#!#3"Fc-#!#3"CQC#!#3"@CQ#!#3"6-c#!$ZlJ#
+3"!J!hGd!N!3)!,Zl!*!%#!#UUJ#3"!J!L)J!N!3)!(Gh!*!%#!"993#3"!J!4%3
+!N!3)!#)L!*!%#!!4%3#3"!J!!!$ZlJ!!#!!!!0hG!!!)!!!!ZlX!!!J!!!#UUJ!
+!#!!!!)L)!!!)!!!!GhF!!!J!!!"993!!#!!!!%4%!!!)!!!!)L)!!!J!!!!4%3!
+!#!#3"HlZ#!#3"GhG#!#3"EZl#!#3"DUU#!#3"BL)#!#3"AGh#!#3"999#!#3"84
+%#!#3"5)L#!#3"4%4#!$ZN!B)!0f3"JJ!Zj!'#!#UN!B)!)L3"JJ!Gj!'#!"9N!B
+)!%53"JJ!)T!'#!!4N!B)!*!)j!$*!23"8J#3"4!!L3!!"S(rq2rk!!X!ri%!q`!
+"q[rk!)err`!!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$
+i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$
+i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J)!2J!q!$i!2V
+rqJ#0Irm!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d
+!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d
+!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!#2d!r3$p!2hkrrS
+!MArr!!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$
+i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$
+i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!J!q!$i!2J!q[rk!)e
+rr`$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d
+!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d
+!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3!)r3$p!2d!rIVrqJ#0Irm
+!!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$
+i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$
+i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i#!$i!2J!q!$krrS!MArr!2d
+!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d
+!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d
+!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!!Mp!2d!r3$pq[rk!)err`!!q!$
+i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$
+i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$
+i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J)!2J!q!$i!2VrqJ#0Irm!r3$p!2d
+!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d
+!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d
+!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!#2d!r3$p!2hkrrS!MArr!!$i!2J!q!$
+i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$
+i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$
+i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!J!q!$i!2J!q[rk!)err`$p!2d!r3$p!2d
+!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d
+!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d
+!r3$p!2d!r3$p!2d!r3$p!2d!r3!)r3$p!2d!rIVrqJ#0Irm!!2J!q!$i!2J!q!$
+i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$
+i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$i!2J!q!$
+i!2J!q!$i!2J!q!$i!2J!q!$i#!$i!2J!q!$krrS!MArr!2d!r3$p!2d!r3$p!2d
+!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d
+!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d!r3$p!2d
+!r3$p!2d!r3$p!2d!r3$p!!Mp!2d!r3$pq[rk!!S!ri(kq[S!rrS!"S(rq2rk!!!
+!r`!!!B`"M!#3"4!!%!!4![m-!2rq!4N!5!!!!%J!N!F3!"!a!!(e!"i!!3!+!*!
+&%!!3!*Q!#!#3"4!!%!#3#8J!!!")!*!&"!!"!!3!N!3"'6AS!*!'6l-!!!!2!!$
+rN!B!!Hk3"J!#hC!'!!2-N!B!",Z3"J!&UT!'!!DCN!B!"iL3"J!)Gj!'!!PQN!B
+!#P@3"J!,4*!'!!`cN!B!$5+3"J!1%C!'!!m!N!X3!"!!N!83!"!!3!!+!*!&%!!
+3![Rr"J$`q`!!M`B!m2XL!)m)!2$p)J,GdSm)!2$p)J,GdSm)!2$p)J,GdSm*"r!
+L)Y)LhG+2#3I`)Lh5)Yh5M`J"m#,ph3(5M`J"m#hph3(5M`J"m#,ph3%LM`N$m#)
+Yd[iL!)m*!r!L)Y,q)J#2"J$`qb)!M`B!q2Z)!)m#qIm!r`!!!B`"M!#3"4!!%!!
+4![m-!2rq!4N!5!!!!%J!N!F3!"!a!!(e!"i!!3!+!*!&%!!3!*Q!#!#3"4!!%!#
+3#8J!!!")!*!&"!!"!!3!N!3"'6@-!*!'8-UV!!!2!!$rN!B!!Hk3"J!#hC!'!!2
+-N!B!",Z3"J!&UT!'!!DCN!B!"iL3"J!)Gj!'!!PQN!B!#P@3"J!,4*!'!!`cN!B
+!$5+3"J!1%C!'!!m!N!X3!"!!N!83!"!!3!!+!*!&%!!3![Rr"J$iqiJ!M`B!q2X
+L!#m'!2Ml)J![#!$ir5)#,Gd[#!$ir5)#,Gd[#!$ir5)#,Gd[#3Ii)L)Y)LhG,`N
+(q#)Lh5)Yh5m)![JL,IhG!#m(!IJLr0d!,`N#q#)YrYd"dLm*!rJL)Yhq)J![#32
+i)L)YrL)!,`B!q2XL!#m#qIm!r`!!")i"!*!'!Jj5CA&eDA*PC#"6G@PdC64&GQ9
+ZG(-JG'KKG#"PGQ9bH5""45"KGf&bC5"KF("XD@0KG'P[EL"YGA0d)(0eF("[FR3
+ZFQ9aC!!"!!%!N!J88h4KEQ3J3@a[EQ8J4'pMG@ePER3cU6%j168J4h*PC@iJ6@p
+eER4KD@iJ8fpQG(GKFQ8X)%&XE#"5D@GSG(-J8Q9cCA*fC@3Z!'4MB@8!!3!"!!B
+'C'p'D@jN9QCTEQ3JFh4bD@jR)'PZ)'4[Bh9YC@jd,#"TCL"QEh9ZC#"YEhCP)'4
+[Bh9YC@jd)(4[)(4SBA3JE'pMBA4TEfiJB@jN)'KTE'PdC5"QEh9ZC#"dCAKdC'0
+KC@4QEQ4#6dp-'RGKFb"cG(*TEQFJB@0dG@&XE(NJCQpeEQ3r4J!!ER9XE!!p!!!
+!!`TQD@jN8h4bD@jR2@CcG(*849K8&&4PH(3JFh4bD@jR)(4[)'CTEQ3Z)!!!#@e
+KG'0S3f&cC@eMFf9#6dp-&feKG'0S)'0KFf8J+&4bG@8[4Q&XFf8T%!!)B@aX3fK
+KF(03B@aXBd*26d`JFf9KFQ0S)'&XE#"MD'&`G'9bFb!S9(*eC5p'B@acC5Np!!!
+0CfmJG'mJBfKKF(4PFM9%Ef0eE@9ZG#"hD@aX)'G[)(4[)(4SC5"dEh!JEfBJG'K
+P)(0`C@0TCQPPC#"MD'&`G'9b,Q4MB@9RBfK`ER9XE!!p!!"XEfjR,94SC5"MD'&
+`G'9b)(4[)'G[)(4[,L"E-5iZER9YBQ9b)'pQ)'0SBA"dCA*cA3#3"!jREb"dEb"
+MEfjdC@jdFeC%DA0`E'&j)(4SC5"`BA*d)'pQ)(4SC5"NEf0eE@9ZG#"bC@CPFR*
+PC#"dEb"LH5"dD'8JFh"PBfPQD@9N)&4KBQaP)'pQ)%0[ER4PER4c)'PZC'9i,Q4
+MB@9RBfjdER9XE!!p!!"XEfjR394SC5"dB@*XC5"[CL"MEfjdC@jdFb"TG'9Y)(4
+[)'4TFh"XBANZ)&Xa,LjZG@eLCA)JEfBJ9%p$)'9ZG(*TCA0G!*!%%QjeE@*PFL"
+[CL"MD'&`G'9bFcY5CA4eFQjc)(4SC5"ZG@eLCA)JEfBJBfKKF(4PFR-JD@iJG'K
+P)(0dB@jN)'&XEfjP)'4[Bh9YC@jd,Q9NBf&PEQ0SF'a[EQFA9'KP)'jeE@*PFL"
+[CL"MD'&`G'9bFbi!!'jeE'`!N!B5ER9YBQ9b)'pQ)'0[ER4PER4c0e*PG(9bER-
+JG'KP)'jeE@*PFL"[CL"PER4bD@9c)'PZ)(4SC5"8B@*XC5"[CL"$EfjdC@jdFbj
+TC'0KC@jMER4XEfjR(e4SC5"ZG@eLCA)JEfBJBfpZG'9ZG(-JC@jdFQPPFbi!!'j
+eE'`!N!B)Ff0bEfaX9'mX8f0bEfaX)(4[)(4[F#"[CL"cF'9MD@CTC@3JF'&bB@G
+bBA"S)'jeE@*PFLjNBf&PFf0bE'jeE'`!23!!E'pZCaYcBh*[E'`JC'phEL"fB@a
+eC5"ED@jdC@GPFPd!N!d`!*!("!!!rj!'!!%!N!F#!*!(!`#3"`6rN!B!!!!8!*!
+A)b+T-6Ni0Lda16Ni)%GbC@9Z)%e[G@jdB@PZ)&0[CR4hBA*P!!!!MJC(C@jPGQ%
+!N$S*!*!("!!%!*!&"3!*!*!,"J#3#`B!N!X'!*!,"J#3$"Dd!!!!!Ch1@Bm[2%0
+24%9#CkQJ)"GR!!$b)%!J8#iB,"#TSh!!)%f4aQ!#%-#ac@hk3Hd!+%2eH!"J!K$
+!XFPYqPQ2,ca%394"3QHTS#"A)!KR!!#f,`dJ8%KS!!41ZJ#`8)p$q[qF+dQ,RL*
+06VS#'#*YLjj1ZJ)3UD01ZJ+@3Lf,Sc!mU*qR4Lm)-$bKQ+0'XGpR#KYm!!',Sh!
+"SCJ`2+R`TdBV5)ZD-$bTmDG'+dL,PM!mUI5R4LY)Lj)`2+R`3IS#D+C(-$bTm8(
+k!b5Q4c!mUI4"qJ!ZTNG1Z3!!")K1Z3!!"L4)HJ!L5LhrrfF#3QG#Cdkj!!!@"Pb
+23UG1Z3!!")T1ZJ1-UI3!N!4)ja``@8mQE`!FH!"J!!$N(TXI@`!"(eX!!KpE!!-
+NE`!JeGF@'dL$-!-#3!#!C`i#3`"r&0Y63dT$E2KJjM!$!N!!3'F1-!-#3!!r8N"
+)`0A!B0!`!`*!!#"R#J*$!"p53aSEB!i`!`*!!""R%!*$!!pkra6&8d0+3fciB+B
+`!`a!!!4LC0"!-$X!"Nll!!)!B!!+!"`!,!"#@)S8r2rr&2crra6E&0YJ!2pk@)S
+8r2rr&0X8fa6EB!$rDK6mrkN8r2r`9)S8fa6E8SS8ff!!re38r2qT&2crm&++&0X
+8fa6E8SS8ff!!rc`r2!!2UFP54!a%!!0Y!2mB)%YB6dcI$$K1G5m&@8mLE`!-(TN
+I@3!"(eN!!KpC!!-U&h3!B%`5'4!"!N!!J'F-dJ%3!8L!5-$8J'!S(S%I@3!"%!%
+#3!"!C```&q9)iN")`05!B!iI@3!#(eN!!b3AjBVLJL"[!"!J,`!8dE!S!&1&5S9
+ZX#"*@%mU(dje,`SN55m0,`S[#%kkri![,BZH,`S[#%kkrh3[#Lm+,`K1Z[pU6qm
+!*#4I6R8[#L4*,`e%Pbm+,`K1Z[p5,bf,RN5A,`S[#%kkrd3[#N5A,`S[#%kkrcK
+2l`!N*&p1GE[k!#KQ!Nje51F!K#Tk!"`JEBZD5Qm!$'B%)'f,PLp)!!T-hb%!9%p
+1G3#3"%(krrSJM8je3rN!!!3B`2`!%#1)#2"1G6mm!!&1Z[qd9%p)jq$J9Dm!'#4
+[!"JJ,BZNC`SJ3$mU!!C1N!"8Me$i#PjCMbmm3dp%46mU!!DTS#!ACKBJ,BZ`CJ4
+`$kR*)%!r+J!'6T!!9)pJfNSi#l*R"#"!S'3J9k!T)&mJ8#!)S&8J3#m)-#S!"Nk
+krhiL50(S!!K1Z[lJ)&mL6G2S!!3`+!!#)JKJ$$0m6[N!!01T!!*3L9()rr*+,BZ
+MC`4`!D'B)#f,U'F+)%!r+J!'6T!!9)p-h`F(5MJ",@F#UIp1G6mm!!"1Z[lZ9%m
+[#L4[!!J-DNlj!!"QHJaU!!)!"QebNFJ`+J!'6VVr!PQ2,ca$6d4&2bS!"UQJ)"G
+Q"&L2B&)J3#"3)NM4k!!)6VVqGL"A)&!L6G2S!!3`+!!#)JKJ$$0mUI!!!*1T!!*
+3L9()rr)J9k!U)&qJ58SYLk0R"(!"SCJJ,BZXC`SJ3$mU!!C1N!"8Mb4I,Tp1G8j
+e6VS!+URd6R8UH!N%-$bTp#"YLj+Q4c!mUI!JEBZDTNF`2+Ra)'f,PUC(6R8[#Q!
+8+e+,Y$mmrrm[+J!))'S!"%k3!&a2*'f,Y#!+CZ3NAdje51F`!(3#6[XL!'!+6!%
+!!%cI!!a1G53!5%,%`5B"5%2'`04$5%*#3X$"d)*-h`!-6R9)jc!!G!*1qb)!B!T
+-33!!60m!$%je*!&#3NK#CK`f!%*!5%"R"S$"0!")3M!$J-%d!#!#60m!$%je0!"
+#3%K!5%)Q!A)2e),4J,#$C353!)05!P(*rr)J!NcI!!a1G8U!E!a%J%U"E""%J8l
+krj4+J@d%6[VrM%5"6VVrKN5!6R9)jc!!G!*1qb)!B!a-33!")!&-h`!-6R8N!8*
+#5%*Q($B!3N")3'F'J-%d!%K#-!1!`8*!5%"-h`!-6R8d!%*!5%")3LB"FJr8JY'
+!X)0P!T!!Je(*rr4-h`!-6R9+J@`#4)&+J'd%6[VrQ%5!6VVrNN5!6R8JAb*)dYL
+`@'`#6Y'`@'m#6Y%b',"BCJ63d%l39%K4bIrd6Y&1G9P2U53JAdjeKN42584-43!
+!!%r[rr!JE`!83pFLf#,B)YJLf#![!!,KQ!+!!!!!re1!Ca!%J!!!!2PR!Q"F6VV
+r`'"@F!(!V`!#5S"A`%3!'d#0UdSYMDYR&%kj!!!!q%SYMCTR0%kj!!!#!'!X@8q
+T*#"IXHhmiQB)6VN!!!$`B"K+,BfDCa*C6kNN)&qalIM%CJC1Z3!!!IK2l`!3,Tp
+1GBG"8eG*9%0)!!"2lrrX98p#CdK[!!JJAc!IS$"53"k!%"mZV`!1,eF!'%r[!"4
+1GBY(6%p#38a06e9643!!6qrrp(!m,d!!"%SYMDYQ#&P2U53JAbk),fm!"!!),fm
+!#!!36qm!$%jeL%G&9&0-4893!!!!51F!1%r[rqiSE`!L@8qT*#"I*%K+,BfVCJ!
+!l&92,`T1Z3!!!ZJ3(fB!!0`[#UKc@8qSf#"I*%K+,BfNC`KC6kMB)&mQ5%K[!#D
+SF5m+,cb!!)!!,carrRrqU0j+,BfDC`aC6kNN)&qalIM%C`SJEIK`)&"+8'B15'f
+-&UK4,`S[$+MFB(*+,BfNCf"96bm[!#K)E`!'5'm!&%kj!!!#5"!ICdK+,BfJC`j
++VIKdC`J[,IKdUKaJ##"Yq(J[%+K45'm!!NK[!!j1Z3!!![![E`!'!!i[E`!+!")
+[#dK[!"+Shbm,,`bSh&K2B!a)EB`@U&%[#Lm-U0`[#UMC5Lf0T'F%,`ZSf8r[!"*
+-ha`!)&p36dl3M%&%5P969%098P028J!!!%r[rqiJE`!D,e!!##pS!!3!$#"[!"i
+ZN!![D!!%!!4#E`!32fm!%!!L6qm!%L"I6qm!$%l3LdK"6N4-48p"8&"-!!"2lrr
+Z)'m!'Lp3!!J[D!!%!!`JE`!H,T!!,fJ!"!!%3Qm!%$p[!"!!)Nr[!")JAdr[!!a
+1d)Y)38j%6%9%39"36!!!6qrrlL"[!"S[8!!),fJ!"!!-)'m!(Lk3!#pS!!3!"%*
+[!"!rE`!3!#*2l`!5)&p2l`!-6Y#,5%&14%a&8%&38%`!!%r[rqiJE`!D,e!!##p
+S!!3!$#"[!"iZN!![D!!%!!3EI!!"r1G#E`!32fm!%!!L6qm!%L"I6qm!$%l3LdK
+"6N4-49&"8&"-!!"96b"[!!C)D2rd-$`#"+J@-"mr!&52,Tp1GBK$E'9KEP9`-3!
+!!%T[!!KR'L"[!!3aE`!)rr)[,`!%6VVra#j[!!41qJ%8)&pF6dl3L%CKD@a&FR)
+b!!!!,`02lrq`)'m!A#p3!!3[D!!%!!JJE`"J,e!!$#pS!!3!%%+[!%a"l`!8d2`
+!+%MJ2cT96dK[!!i[,Ii8,bhq'%K[!&B`2!J5U"B`(cm!5'm!9NkkrhSJE`"-)&!
+ZN!"96bm[!!+SDc!I0J!-E3!"Nj!!E`!!J,CYNijRH%T$Eh5fEC13!'jZ)'hmiNK
+S!"#T+%SYMD9R##mYq)!r!kPM2`0#*dkj!!!#i%kj!!!#d%+R3UF[,ILBUG%[I$r
+mc-`!2#pmc*!%!%!rI-c0!%4)E`!m2c`!!LmYq*J[,IL%6VN!!!+B6VN!!!*B)'h
+miNKS!"#T+NK[!&41Z[k`3Qm!4Q!-6qrrV%([!"4-f&cm2fm!4J"N6qm!8#BI)&p
+2l`!-6Y#-5%&14%a&4d0"8&"-!!!!98mJE`!'5'Mrq$!m!J5S&M!I2`"8MbkI6R@
+)3faPB@j9F$-!!!"+E`!)CaSJE`!%-@m!#2r',bm!"%kkrm3ZE`!%6[S!ZL"IA%p
+1d)K'B@PX4A*b0!!!!%r[rlSJE`"1,e!!$LpS!!3!%L"[!&)ZN!![D!!%!!4#V`"
+#5Lf0QQG`-#hib0"YNj!!5-![3!!)5Um!%QGF3Hm!&Y$m!#K)i$mk98m[,IiF5'm
+!$NKi!!4)E`"--$`)*DJ@-"mr!%K[!%K1Z[pN3Hm!&Y$m!#K)i$mk98p)E`!3,bh
+q)%K[!%J`2!B3U"B`(cm!5'm!5%kkrcK)E`"'6VVr#N*[!!aJ$%r[rlT"l`!@60K
+Fr$p[!!`!9Nr[!%BJAdr[!!a1d)a)38j%6%916N&38%`!!!"96b"[!!C)D2ri-$`
+#"+J@-"mr!&52,Tp1GBK$E'9KEP9`03!!!%T[!!KR'L"[!!3aE`!)rmB[,`!%6VV
+ra#j[!!41qJ#Z)&pF6dl3L%CKD@a&FR)f!!!!6qrrZL"[!%i[8!!1,fJ!"!!5)'m
+!8Lk3!#pS!!3!"%+[!%)`EC13!#p)!!K+V`!5Cea"l`!@d2`!+%MJ2cT96bmYrL4
+)E`!15(J!"%K[!%``2!JPU"B`(cm!5'm!5%kkrh""l`!@d2`!+%MJ2cT96dK[!"!
+[,IiS5'm!5$!m"K#S&M!I2`")E`")6VVr4%K[!%C1Z[m@3Qm!$'!-6qrrZN([!"C
+-f&cm2fm!$!"@6qm!4L"I6qm!$%l3M%K"6N4-48j$39"36!!!!&92)'m!"NKSrqJ
+`2!)%U"B`(cm!9)mZRdjeL%0XC@&Z9A!h!!!!5Qm!#'FD)'m!"$&[!!Mqi#m[!!4
+1Z[r%,Qm!"%lk!6BJAea26Y#)4Q&TE%9bFMJ!!!")jaJ`6qrpXL"[!QBZN!![D!!
+%!!3JE`*U,e!"$LpS!!3"%N+[!NT+,BfDC`!!k%([!4E3r!!S51!r1P925'm"%#m
+YrL`[,Ii`5'm#9$!m#"+S&M!I2`")E`*J6VVrFL"[!NSJ8#J398m["+KV-"mf!%A
+Yq,``+J!-d'f6N!#f3'i!!*4(l`&!-%-J#&1!jBJJ5N(S!"K+F!J#CKi`3b!)8i$
+PL#"+3HJ!'$9`#!!!$N*U!""#DJ!5B%4(l`&!5'm!#$"$)!K6J1@))%T"k!!B2c!
+)!Nkj!!!"X%([!!a$l`&%F%!Lf&()rr`bf$96!!ieD`!#!"!eD`!%!"*B6cmU!!i
+r+J!32bS!%Nkj!!!"U%kj!!!#d%K[!Pj1Z[k13Qm"2Q!-6qrpSN([!4C-f&cm2fm
+"2J*Z6qm#6NcI$"JJAdr[!!a1d)a)38j%6%9(6N&38%`!!!"96b"[!!C)D2r`-$`
+#"+J@-"mr!&52,Tp1GBK$E'9KEP9`13!!!%T[!!KR'L"[!!3aE`!)rqi[,`!%6VV
+ra#j[!!41qJ%D)&pF6dl3L8CKD@a&FR)a-!!!51FB!%r[rl)JE`"H,e!!"#pS!!3
+!##"[!')[8!!3,fJ!"!!83Um!5N([!"c3r!!S51!r1P925'm!%LmYrM3[,Iii5'm
+!9$!m#"+S&M!I2`")E`"B6VVrH#"[!%SJ8#J398m["+KV-"mf!%T$E3!!LP922`-
+[,ILB6VN!!!0i-"mf!&P22`-[,ILB2c`!#+Jp,em!$#p[!!`!'&922`-[,ILB6VN
+!!!0`-"mi!#mYq)4C6h!"d%4)`#m!F!(34%M!,`![,ILB2c`!#DJp)"m[3!!%98m
+[,IL%U@!`(p"[!"a)`*!!V`!%9B!r!+PM6VN!!!*B6VN!!!,35'm!9NkkrUT#E`"
+%B!a2lrqU3Hm!(%cBA2`rE`"%!'C2l`"160m!'#"I6qm!$%l3M%K"6N4-490$39"
+36!!!!#m+6qrqj#4[!6!JE`%N,e!"%LpS!!3"&L"[!5J[8!%+,fJ!"!%1)'m",#p
+3!3)[D!!%!3C)9bm[!3T1Z3!!!pK"l`!%@%p$lBb-)$`!!!%!SLiJE`%1)&!E8)f
+-)'m"&L"3'e#0M4pm!!%"'dK[!4Y1Z3!!!BK1Z3!!!Y"96bm+-$`#"+J@-"mr!&5
+23US!"&92,bhq2%K[!5&)H!!",`S`2!JPU"B`(cm!9)p#E`%!2fm"!!%d6qm"(#4
+I)&p2l`!36Y#+4%p"48424NP14!!!!&92)'m!"NKSrrJ`2!)%U"B`(cm!9)p96b"
+[!!C)D2qi-$`#"+J@-"mr!&5298mJE`!'5'Mr`$!m!J5S&M!I2`"8Me92)'m!"NK
+SrmJ`2!)%U"B`(cm!9)mZRdjeL80XC@&Z9A!a-3!!5Qm!#'FD)'m!"$&[!!MrULm
+[!!41Z[q#,Qm!"%lk!EBJAea26Y#*4Q&TE%9bFM%b!!"2lrqH)'m!DLp3!!i[D!!
+%!")JE`"Z,T!!,fJ!"!!%3Um!AN+[!"j#V`!Q3Um!,N([!$,3r!!S51!r1P925'm
+!!LmYrN![,Ij%5'm!D$!m#"+S&M!I2`")E`"N6VVrFN([!$,3r!!S51!r1P925'm
+!A%K[!!i`2!3(U"B`(cm!5'm!C%kkrdT+,BfEC`!"#(!$X+m!#'B!!2j"l`!bd2`
+!+%MJ2cT96dK[!&a)H!!",bhq5%K[!#4)E`!X-$`+#kJ@-"mr!%K[!'41Z[m%3Hm
+!-Y$m!#K)i$mk98p)E`"F5(J!!LmYrNa)E`!N5'm!0$!m#JZS&M!I2`")E`"N6VV
+qd%([!$,3r!!S51!r1P925'm!A%Ki!!-[,Ij35'm!*%K[!$``2!S,U"B`(cm!5'm
+!C%kkrTa"l`!bd2`!+%MJ2cT96dK[!&a)E`!J5'm!,%K[!$K1Z[e!-"mr!%K[!'4
+1Z[jZ5Um!%QFX3Hm!-Y$m!#K)i$mk98p)E`!3,bhq9%K[!'3`2!B3U"B`(cm!5'm
+!C%kkrMa)E`"L6VVpc%*[!!aJ$%r[rjj"l`!b60KFr$p[!!`!FNr[!')JAdr[!!a
+1d)a)38j%6%9%4N&38%`!!!")ja!J6qrrl&P2U0JJAb4)5Lf0SQF!!4T96bmYrPJ
+[,IjF5(VdJN+R3LF`2!NIU"B`(cB!98m[,IjJ,bhqC%Kkp5a#Td)R-$`*(kJ@-"m
+f!&92,bhqD#mYrQa)H[5-3UG#*c!m#4qS&M!I0J"96bmYrR![,Ijd5(VdXN+R3LF
+`2!NIU"B`(cB!98m[,Iji,bhqI%KkpAK#Td)R-$`*(kJ@-"mf!&92,bhqJ#mYrS4
+)H[N`3UG#*c!m#4qS&M!I0J"96bmYrSJ[,Ik-5(Vfb%+R3LF`2!NIU"B`(cB!98m
+[,Ik3!#mYrT4)H[IB3UG#*c!m#4qS&M!I0J"96bmYrTJ[,IkF5(VkL%+R3LF`2!N
+IU"B`(cB!98m[,IkJ,bhqT%Kkr4"#Td)R-$`*(kJ@-"mf!%SYMDaR,PP26VVahLk
+I,aF[#NkkmMj96cmmrrp)E`!)@8p1Z[(i)"m[!#m+U'!3(aB!B"+TY&922ccrrdK
+[!!LTF"!I&J"+!fF!!+`[,`!1,`T1Z[(q-#m!"%kj!!!'!!#D!!%!&`!'!!%!'J!
+$!#i!"3!H!!B!8J!)!#i!$`"@!"F!A%K[!!41Z3!!!3KJDNK[!!41Z3!!!4"JANK
+[!!41Z3!!!4"J8NK[!!4`!$![!"B#J!!!!!&+J&E!4!!I!%kj!!!"''!b5'm!"%k
+j!!!")'!Q5'm!"%kkm(4J(%kj!!!#f&925'm!"M!m!KZS&M!I0J"J"%kkm%4+,Ic
+RC`$r!%r[!"4-h`3)6R@068&*6N9@48j86%p28!!!6Ud!++"MS$DJ0U!fS$DJ0U!
+f5'f-JUKZU2kT%UN`UFa)H!!!UAX[2!!!rrmJ(k!b6Ud!-%kY!%K1V3"!6Ud!1%U
+YMDjR(#mmb!!!!+Mp,bf0VLmm)!3%J+Mp,cc3!!!!U2e)E3!SUI&1Z[e+,bhmiUN
+@98mr,C(i,bhqU%*R5'hqV"mm!!&1Z3!!"!J3(fF'6VN!!!&J5Lf0QQF),bhid#"
+IS#01GB4YB@PZ!*!&"5S!!!6`rrrp'T*cF(4YFfjN)!&K4%a24`&KGQ9b)(1jHA0
+fCACZG(&dD@eaC(*hC(*KCf0bFh*$99*63dp%43a6C@GYC@jd8fpeEQ3!!FS"!&G
+ZC'piG()bCL"[S(3)6Np$99086dd!!h"[F!%JBfjdF'0ZG#0c9(G%!@%"B8q!q%'
+"!IK"K!(m!,`"%eZ'm!!B'P&955"8J9*")%k!95"-L8C14%G'58j%6P8J6)*2993
+J8+T56P4338G&3dj86!4MD'&`!(0`G'd"BA*44%B(3dK*3d&(6`%J!3e%8PC5)Lf
+(E'pZCfa[EQFL,B0XEfjR*Lf$E'pZCb)YK'a[EQGL)'q!E#)YL'aTFh4849K8BL"
+[J@aL)'q!E#)YK@&PGR4[B5"`rf&PGR4aG@PdB@9fG'pNEf0KCACdF'4[Bf4MB@9
+RBfK`C'0KC@GMER4NBf&PEQ0ZG'4MB@9ZBfK`C'0KCA0MFQaNBf&PC'CZC%024%8
+-8f9RE@9ZG&0[G@jN!#!)!3e35808!5!")'0XGA4849K8!@&849K8Fh4jE!&KFh4
+jE&GZNf4[F%PZCR"*EQC35808!5!")!%JAB)J#!)J)%#!!L!J3)!#)#"!J!)J)%#
+!!L!J3)!#)#"!MJ%J!5!#,#!!!5!"$3!"!b%JK3%J!3d"$9f#)!K0)'q"9NdJEj0
+@4'Y!8!)[9`!",3*K,`!"B94&@#"8Ld9B9(0ZC#"*3dp135"3J8a")&#%6%4V3&!
+JG)aiG&4&@&4%Dfe59%9B)&5"49JJ9)P&@&4cG(PX"d0))%qA8d95!@&cBh"dFf0
+`G'pcB5"cBh"d9%9B)&5%49K8ER8JE)&ZG5"XJ@je)'b$FfPREL)YK&4&@&4P)(+
+%EQa[EQFL,B0XEfjR33#3"#J!N!3S!`!-%!-!S"!$"b33!aAb%!-BJK!$!!`2!`!
+S$`-!3!m$!)!2!`#H$`-!iJm$!4J2!`%i$`-"@!m$!CB2!`'k$`-"c!m$!H)2!`)
+%$`-%'Jm$#iS2!`Zf$`--(!m$$8`2!`hQ$`-!$!d$!+J0!`kd$3-2)Jd$&P)0!aK
+J$3-Bm!d$!)!-!`$N#`-"VJS$!J)+!`!-#3-!+!N$!%`*!`"m#3-!Q!N$!13*!`*
+)#3-%$JJ$"p!)!`!-"`-"$!F$#$J'!`!-"3-"AJ8$!rJ&!`3k"3-&'J8$"E)&!`C
+1"3-'T!8$#&S&!`YH"3-08J8$$BJ&!`h8"3-'+J3$%#S%!`!-!`-!SJ-$"&i$!`8
+N!`-(-J-$"r3$!`N@!`-+XJ-$#ji$!`c!!`-0)J-$$Ci$!`jX!`-1L!-$$fJ$!`q
+f!`-3rJ-$%K3$!a--!`-81J-$&0J$!aA3!`-@CJ-$'3i$!aT#!`-!$!)$!%3#!`#
+k!J-"$!)$!eB#!`4@!J-'0!)$"V)#!`Fd!J-(H!)$"m3#!`J1!J-)8!)$#+3#!`N
+b!J-+A!)$#Xi#!`X)!J-,F!)$$$J#!`e8!J-0V!)$$L!#!`j)!J-1F!)$$UB#!`l
+'!J-21!)$$i!#!`r)!J-3&J)$%+3#!a'#!J-5"!)$%Z)#!a0`!J-6i!)$&'`#4B%
+@Y%f"&3C0J5,D6B%AQNf"$Xj0J3R16B%"B%f"#%C0J3+U6B%$Z%f"!ZK0J3)%6B%
+C6Nk!!8f"$RC0J4T-9`#3#!&#$!#3"aj"MN'cKSU03&'pPd%aJjZ$3H+EJd#,PD@
+$3%#EJd)rM2U@KSP!BS8!!!!&3'k$LS9+)`#3"K8L!ZJ!*J!!!ZJ!!"8'98p+V`!
+'CJC#,`!"B"!JE`!'5QJ!E&h!4!!I3!!"(fm!!3!+9%mZRdjeLNP64%&A58j%6eF
+!!!"46b"[!!`ZN!![D!!%!!4)9kK`5'm!"+K`)'m!%##A)@m!"!!%8%mZRdjeN8a
+23d&-9%p(6%p#38a54808!!"2lrm!,bm""%K[!!41Z3!!!+""eb*[!3JJ2!!!!3#
+L,Nr[!3!ZRdjeM%a26NG86e088NP14`!!!%r[rI``E`)),SK)E`!%,bm!"%kkrl4
+"l`!)@%p$l`%%)$`!!!%!SLj"l`%%)Qm##L!m!!!"!+)Z6qm#"#"I9%p1d)aA6e*
+%9%p69&**6NF!!!"2lrm!)'m""%2AF$mLf&()rra)9amm!!&1Z3!!!&K"eb*[!3J
+J2!!!!3#L,Nr[!3!ZRdjeK99$390&!!")ja`i6qrrm#"[!#`ZN!![D!!%!!4+,Bf
+JC`!!QPP2ULNJAb4)H!"k!'"#98p)E`!#)&*)D!!L5'm!%ULU%"m@!%S$Cajk!8I
+[!!J`+`!'N!"V!!)f+`!%PP2(`,D%E`3S!bK+@8m[#USV)&mN5#!+CVT+"@B)@8q
+U+L"I+%KC6kSU)&qjb'B-98mqZ!ZU-"mf!'!#GJ!N9%AU!#)[,`!`2bS!!M!5d%-
+r!$mU!!Br+J!%U+GJ)NAYq+3[,`!`2bS!!P922VJ,UM!Id&)r!$mU!!Br+J!%U+G
+2l`!360mF1#kI6R@24d984%p058j"6P454808!!![#Nr[rq4)9kKd,bm!,+Kc)'m
+!,%SS!'jQH%AYq+3[,`!X-")%3#F32`!`+J!#"%!R%$m!3LHT'bm[!#`I2!!"U3J
+JE`!X)'J!FL"3,fJ!!J!8,fJ!"J!B5'm!"#"[!$")D!!36VVpSLp[!!J!%#p[!!`
+!&#m[!$"#*kN)4HhiT#m[!$!r%MmU!!*#*kNE@%pJ0#"[!#`JD!"b)&![D!!#!"3
+[D!!'!"K)E`!%)'m!-%KS!""1Z[e5,fm!#!!3,fm!$!!8@%p&l`!8,bm!+$!U!!D
+3!'S!!Mm!-#S!"*!!8Mm!U)![,`!N-#m!%T!!E`!D2`!`,`!5N!"[!"Sr!+L!,aH
+SFdr[!"`NAb"I6qm!$%l3L%G&9&088P9$!!!!51F3-%r[rpJQE`!q,`Y)E`!N5'm
+!,%kkrXj&l`!k5'm!'$!U!!+3!'m!+Mm!-"+3!'m!+Mm!-#S!!T!!E`!Zd'm!+Mm
+!-"+3!'m!,Y"[!#Sr!+LR5&G)E`!F6VVpQLp[!!3!&#p[!!J!'%A[!"4)E`!-F!V
+3DJ!#d'm!,Mm!F!V38Y"[!#ir!(!+d'm!,M)U!!D530*[!$)r!A!+d'm!,M)U!!5
+530*[!$)r!DLR5'm!$#m[!%+T6L!I*J![#e92,`1SDc!I2`"96bm$U'S`(cm!3LH
+T'dS[!$KR##m,U48[#kKc6qm!+%cI$!JJAdr[!!T1d)a-6d0"9%9A58j%6eF!!!"
+)jai`6qrrj#4[!$im,`!m1#m!1LkYM!i[EB`5!!3Q8LpV!"!!&#pV!"3!'#m5F$,
+3E`!)2`"`-Y"[!!`r!%)RU4X[%Kmm!!'T##"V!()J8#pS!!)!##pS!!B!$#m53LH
+T#$![!!k3!'m!#T!!E`!Dd'm!&NM!+J$JMH#0i)hZMGU!iS8f,`!-PQm!#*C[!"M
+@E`!8$%-!%fm%GK0J%M"$)!MJL1#)i)MZL0#)iS!f!$!'$%!!#@)!!)l33$!l!!C
+1q`!#!))!3J!8!%i!3J!8!%i!3J!8!%i`,`!%"%!!&*!!E`!-d'm!#%M!)J$JLH#
+*i)RZLG+!iS&`&0"$5-$3J6p!!""J3(!8d%234$p!!""J0!a$!"0Q'$![!"L3!'m
+!&&4!d%3b,`!%NN!r33!3B"B`,`!BN!"[!"633p"%-Lm!"**!2d%!%$!'8d!-3!!
+)BP4A3'd`9d"Y!Q!d-#m!"T!!E`!#N!"[!!l3E`!+5-!L!1#*i)RJLHk*dS$LJ6"
+&dSJr33!5B#!`"G"%2d!!%Q!@-#m!'T!!E`!@d%A34$)[!!D53$p"!")[%Mm[!"B
+r,`!@3LHT'dS[!$KR##m5U48[%UNI6qm!(%cI$(JJAdr[!!T1d)a$48j849*A58j
+%6eF!!!")jaJ!6qrrm#mm!!$rrb!IS$*f!%SYMDaR(&922ccrrdK[!!3[2(rrrrp
+)H!!!U'!3(aJ!B"+TY&922ccrrdK[!!5TF"!I'!!`&e0!C`T93'F'98"R!Q!#GJ&
++!fHf,c`!!2rr)"qJ-Nr[!""-h`!B6R@)3e9&49C&6P3!!!![#Nr[rqiJE`!N3qm
+!!L,B)YJLf#,B4Hm!!L!m!!!!rm#U!!)JE`!D-)!J2!!!r`$!UJ!#)J$ZJH#*i)R
+JLG+!i)%JE`!H-)%`E`!LF!!`,`!LFJ!b+J!1`S#bL&I"4!%I33!"(fm!!3!S6qm
+!%L4I)&p2l`!16Y#(5d9C8&*23`!!6qrrmLm[!"5SFbm[!"3r,`!@5'm!"NK[!!a
+)E`!8UBdJE`!B)+m!"L&[!!S!"%r[!!iJAea26Y#)4d984&*&3e3!!!"2lrlb)'m
+"%N2[!!T`2b,B8FMrr#m[!4Jr,`%D5'm!"NK[!44)E`!3UBd[,`%+5'm!$UQ26qm
+"$L"I6qm!#Nl3L90&9%4*9%9B9!!!6qrqmLm[!43r,`%@5'm!"NK[!"4)E`!3UBd
+[,`!+5'm!%UQ3!%([!!iLE`%B)$`!!!%!SLj2l`%1)&pF6dl3L8G&9%4*9%9B9!!
+!6qrrmLm[!"DSFbm[!"Br,`!B5'm!"NK[!"4)E`!3UBd[,`!+2bm!&UPG6qm!$L"
+I8%p1d)T"3e4*9N9*9%90!!!!6qrrlLm[!"Jr,`!D5'm!"NK[!"K)E`!3UBd[,`!
+12c`!rDPG5(J!#%K[!!iLAb"IS$XLJ#m[!!j#CkPG6qm!%L"IA%p1d)Y$6%P$5d*
+99&426J!!51FF!%r[rr)D,`!H)'m!)#p3!!B[D!!%!!T#,`!"5J9R"NK[!!DST(J
+"5'm!!UPb98m[,`!%5'm!$+LY%"m@!,B%C``B!dS&C`C)E`!'U+496kPc%"pQdJ`
+%!!&Q%%S&C`C)E`!'U+3II!!"!!%IE`!"!#42l`!160m!1#"IA%p1d)P88N&$5dP
+848d!!%MR%$"2lrrb*Qm!)L4[!"j#,`!0-"063'FH98"RBP9!Cej63'F%B!!!h"p
+m!!%!$65m!I9J!!$1,fX!#J!#98m[,`!%5'm!$+NX-"mf!$!$@8"R"'!!!+iJE`!
+'XHm!*QB!!+)[,`!',bm!"NKYq+bT*4pm!!%!$65m!I4J!!#'98m[#cmm!3")E`!
+)5'm!&Nkkr1i3(aB!5J0R#!a[!#i!#QF)$'m!'`!+CKJII!!"!!d[,`!Q2c`!!Nk
+krQ)d[!!#B%"96c"[!!`[#%KYrVT)H!!#6VN!!!$3%"pR*Kpm!!%!$5"[!#C+U!#
+BEa)[,`!Q2c`!!8kkrLBd[!!"B!3d[2rr(fm!$3!U6qm!$NcI$!JJAdr[!!a1d)a
+69%423e9'58a849)!!!"2lrrX5'm!#+Kd,bm!'+Kc,c`!!`!$U*Y)9bm[!"`r2!!
+"6VVmY#p[!!3!%#p[!!J!&%K[!"![22rmrrbSU8K[!"![2!!3!"#SX#mm!!%!!DL
+E,bm!$+Kc6qm!'#kI6R@25%P-594&4%9'3P989%p1!!![#Pe24GFdV`!B0@m!&!!
+#0@m!%!!%)'m!'L#A-@m!"!!%A%mNAb"I6qm!$%l3L8e"5d9$6da28J!!98md,`!
++)Qm!"R,r)&%`+!"H8d!J88(S!'$3`,4`!!"Y#L"4-LJ!AP0"B#4`!G""-J!J88(
+S!'$3`E4`%!"Zl#"43HJ!B0$"Y(!3!'`#8d%qJ6pA!!a86b"IA%p1d)G(494-58j
+&!!")jamJ@8mq,`!N,bm!)#"IS#NrEIkm!!*k!(ErH!!JE`!J*&![+J!q)&qJ+A`
+"h)0`!G#$*J"C6bmU!$i[!dK[!!p)H!!"5(J!!%Ki!!'Ti#!I*J"`rlD!Ebj96b"
+U!$i[%&92,`1SDc!I2`![2))'!"#SY6!ICK"`!G"&1J#k4ec!4!!B!'!'5S0X!RJ
+"5J4RQLmU!$iJAk!U2SB[,`!J)&qJ+MpA!#CB6dcI"2JJAea26Y#3!%G&9&""8N&
+69%&59%0)39)!!!![#Nr[r[*)9kKd2h`!!J!%5Lf0Q@F!!*aC6cmm#lG)H!!!5(M
+rrkPm)&m[5!%+@8mr2!ZiUESJAb4))&*$l`!')$`!!!%!SLi[,`%+2c`!!dK[!!a
+1Z[VU@8mr2!ZjUESJAb4))&*$l`!')$`!!!%!SLi[,`%+2c`!"%K[!!a1Z[V!5'm
+"#Lmm!"i!""mm!!&1Z[H-,bm"#UKc,bm"#NkkrB4)H!!!5'm!#+Q4,bm"#UQ$$'m
+!!J!%CNTC6cmm#lK)H!!!5(MrrkPm)&m[5!%'5'm""Lmm!"i!""mm!!&1Z[Fq,bm
+""UKc2c`!!DL(2c`!#DL+,bm""UQ"6VVj!#m[!3DTJbmAU(02l`%1*&p1GBP65%p
+A38*2993!!%MR(L!NE`!H1Lm!($`[!"Si,`!B0JCJ),T$CJ`[#Mm$(c`!!DP&B!J
+[#Mm$3LHT43a$IrpR"P*$YN4[h%cI"(JJAdr[!!T1d)a$5%Y26Np'4NP848d!!!"
+)jai`6qrrmLC[!$!k,`!Z2#m!,$J[!#Sf"Q!b,`Xr!dK[!!C)E`!85'm!%+Q0*'m
+!#VC&CJS[#Mmm!!'TBf!',`T#CkPM$%0rrfF'8N1f4'r+6qm!$NcI$(JJAdr[!!T
+1d)p3990)8N&%58p#99486di!!&92-#m!#,"[!!C["Mk[!!KJ"$k[!!Br9`!+9%m
+ZRdjeK&G039J!!!"96c![!!L`E`!'E`BqV`!'B!3qV`!)2eF!#P42,Tp1GB4A68P
+1!!!!6qrr!%KA2bm"#Mm[!3T1Z3!!!,K"eb*[!3JJ2!!!!3#L,Nr[!3!ZRdjeL8G
+&9&*&8e088J!!)'m!##!3d+m!"#"[!!JJJ#"I8%p1d)C*6N039&)!!!")jaJJ6qr
+r!#4[!4!J8KB35)-[#NKi!!&1Z[r'5N0X"!C$!3!`3bJ)F!!`!ak!,a*)E`!&,`3
+J(b*I)&qJ,Lm+-%-[#%kkrjT"eb*[!43J2!!!!3#L,Nr[!3"-h`3B,Tp1GBe69&*
+*6NG'8Np08&45!!"2lrl!)'m"4%2AF$mLf&()rra)9dK[!34)H!!r)"mLAb"IS#j
+"l`%!)Qm"5("!SLj2l`&!,Tp1GBe69&)b06986e088MBc!!"46h!#,S!JE`!-,a"
+)E`!+,bm!##!I)PmJAk!Z,bm!$%Ki!!*1Z[m!2fm!"J!%2fm!"!!38%mZRdjeLeG
+28N4'8Np08&45!!"2lrrdF!3ZJ#"[!"![%%K[!!`[,`!))"mLAb"IS#i[,`!35(J
+!"%kkrVB[E`!)!!3[E`!%!"42l`!-,Tp1GBe28e4C8%9'8Np08&45!!")ja!J6qr
+r!#4[!3`[#L"IS#P"lC!!XN2A)$`!!!%!SLiJ#QFk@8m[#Nkj!!!!8#!I*J!-J`!
+!!2p["LBm!!!!re92,`1SDc!IFJ!b!"k",a*)E`!&,`-J(b*I)&qJ,N(A)Qm"%#!
+m!!!"!+)Z,`SJAk!U6qm"!%cI"!JZRdjeM8K849K89%p69&**6NF!!#m$6qrkrL"
+["3T$l`3#F$mLf&()rra"lC!!XN2[!`)J2!!!!3#L,NK[!J)[2!!F!)"1Z[fD3Hm
+#"PK23qm!!L!m!!!"!+)ZGJ!@,`3#3Hm%!K!`-!#`,`!$CJ*63ck$0KGJ6%(["!)
+3-$!!X#m!!fG%5'm$!N(["!C`!"!`-!!!3!%!2d!#"NK[!JC)E`%+2c`!!Nkj!!!
+!i%([!4"2l`!13qm$!L!m!!!"!+)Z8d--3`!"E+j"l`-#)Qm&$L!m!!!"!+)Z6qm
+&!LBI,Tp1GBe69&**8%C*6%9138e&!!")j`!`6qrrY#"[!&a$l`!#F"%Lf&()rr`
+bf#4[!&K(l`!#&*-9D`!"!!%PD`!#!!*96cmV!!C#TdKV!!T)DJ!'F!'U8M!I2S!
+eI2rr!%a#DJ"13LS!8%)U!&&#UJ"53QS!9Nr[!%a-h``!)&p36dl3Md026PC&8P4
+26%486dj&9`!!51FH!%r[r!!JE`383qm$!(!r)YK4b2rm5&F[2!!F!)"1Z[a+3Hm
+!"&K23qm#!#!m!!!"!+)Z3Hm$!%2[!3!J2!!!!3#L,RJ!HJ!D,`-!2!8f"Q!83Hm
+$!"!`-!#`,`)"CJ3i!f!)8d--3`!"E1C+4'mqZ%9Q%N(YN!#b3qm"!#!m!!!"!+)
+ZB#K)E`-!F!(34$m!-!@3!%3r!%K[!!K1Z3!!!1K"ed2[!3!J2!!!!3#L,N([!3!
+LE`3B)$`!!!%!SLj2l`3!60m!H#kI6R@24d984NP-48C56de3394)!!"2lrcm)'m
+$#%2[!J4`2b,B8FMrr%K[!34)E`))6VVr"%([!3KB6d2[!!3J2!!!!3#L,R!!%#m
+!"$p!!!*`!"![!J3qJ%K[!J3r2!!"-#m!"T!!E`!)2`")E`%-6VN!!!$S3Hm""#*
+[!``J2!!!!3#L,Nr[!`3ZRdjeNdG&9&""9%K'8Np04P9-6&""9%J!!#m+6qrqb#"
+[!84$l`!%F$mLf&()rra&l`%%3US!$%([!!3P5!!5*@m"3!!F3US!-%*U!"C96dK
+[!3BJAh!"SQ!qJ$!I2S!rE`%D!!)rE`!#!8K2l`%i*&mJAe"26Y#24d989P*&4NC
+56de3394)!!![#Nr[r[`JE`%13qm!"(!r)YK4b2rm98qTP$!I2S!r,`%BUCK#*kQ
+E5Lm"$'F5@8m[,`%B5'm!$+JJ)&mN5'!3@8m[,`%B2bm"'UJI)&mN5,Am!*!%9X"
+%!"p!!!-I2!!"UCXr&kQB,`UTSap[!!-"'Nr[!33NAb"I6qm!$Nl3L9*&8d9B590
+88`!!51F!-%r[rm)QE`"+3Lm!!3aY"`#0U'eD*%Y#NN+U!!4&l`!#F$`NJ%+U!!4
+#UJ!iB$*96bm,5'm!#$mm!$USMc!ICL"&l`!#$+T"8&"-!""Q%L!U!"5`V`"1CJJ
+II!!"!!&J$P92,`Xr2!!iU)m`(fI!(fm!!3"56qm!2NcI$!!JAe"26Y#3!&"56d0
+&8e0*8e*96Nj*6NF!N!B)3%K!5d4a3Ma!i%"m3,9!6J#3#L0!!L!!'3!!!L!!!#,
+D,`-JEBfZ)&!VD!!)q*`VD!!-q+"f!%SYMCKR$L"Yq(!J8%SS!"jQ!RC#)'hiF#"
+3-#hiR0"S!"Bl32LF)'hiF#"3-#hiRY"S!"Jl32LH)'hiF#"3-#hiST!!D!!F1d$
+iSL"Yq(!J8$!S!"V33c)Yq+#53$Y"q+!`,ILLN!"Yq*il3*1-*Kp1GBe$38a$8&*
+*6P4338G&!!")jaiJ6qrr0%kkrf!JEIK`)&"#D!!#G[m[,ILB)&qJ+A!"d%-f!&P
+2)'hiQ#"3,bJ!2M"$,`K)EC(c5(J!!8Ki!!")H!!"UH!J(cB!98mJEILB)&!JD!!
+q,a!r!bmmJJB!%+Le-"pQ2L"Yq(!J8(!"d'J!!L"Yq(!J8$&!!!*96cm$,bhiQ%k
+j!!!$F$!I)'hiF#"3-QJ!!L)*8i(5J8([!!3aJ"J!5N0X!2pf,bhiQ#"IS#T&lIL
+F1LS!"*T5-'f6ML!)8i$3J%(YNkJa[!!"#!!`EC11)!K6J0#!3Hf6U$*`#!!J#91
+!jBJJEIK`)&""k%&)3R!)!(B!H!!JEILB)&!m+!"HGJ"J!!+8)'hiF#"3Z'J!!Q`
+!!-*`!G"%5-"6J0#!3Hm!",C`#!"Q!!#XF!(34$J!-'f6ML!)8i$3J%(YNkJbF!J
+!)!P6J1@))'hiF#"33HK"5,C`#!"R!!)i-!063$"YNiiL#&1"dS&"lC1S-R!B!#)
+*8i(PL5"Yq(!J8%(S38JaJ"J#-'f6ML!)8i$3J%(YNkKb!G*`#!!`EC11)!K6J0#
+!3Hf6U$'"#!!`EC11)!K6J0#!3Hf6U$*`#!!J#91!jBJJEIK`)&""k%&)-B-)!'!
+!!Ei[,IK`)&qJ+5"Yq*JJ8,CS!&jQ+M"YNiiJ#&1!d)""lC1S-R!)!#!*8i$PL#"
+Yq(!J8%(S38JaJ`J#B!!"J$"&,SKC6c"$,`J`EC11)!K6J0#!3Hf6U$*`#!!J#91
+!jBJJEIK`)&""k%&)-R!)!#m*,bhiQ$mm!!QS25!IX*GQHM"YNiiJ#&1!d)""lC1
+S-R!)!#!*8i$PL#"Yq(!J8%(S38JaJ`J#-'f6ML!)8i$3J%(YNkKb!G*`#!!`EC1
+1)!K6J0#!3Hf6U$'"#!"`!G"$-'f6ML))8i(5J8(YNkJbF"J!)JP6JH@*)'hiF#"
+33HK"5$'!'!"J!!$%-%8ZL&P2-%-[#$"YNiiJ#&1!d)""lC1S-R!)!#!*8i$PL#"
+Yq(!J8%(S38JbF!J!,`N[,ILB2c`!#DJp)"q`Pfpi-!063$"YNiiL#&1"dS&"lC1
+S-R!B!#)*8i(PL5"Yq(!J8%(S38JaJ"J#-'f6ML!)8i$3J%(YNkKb!G*`#!!`EC1
+1)!K6J0#!3Hf6U$'"#!!`EC11)!K6J0#!3Hf6U$*`#!!J#91!jBJJEIK`)&""k%&
+)-B-)!'!),bhiF#"IS#S-3hrrC`K53lC'E`$pDNr[!-a-h`4i6R@+8N9338G&6N&
+843!!!%MR(#"2lrrf,bhiF#"IS#NJEIK`)&"+8'F!!)SJEIK`)&!k%(B"B(J`3b!
+)8i!L2!!!!4*1Z3!!"0SJEIK`)&""k!%31$!)#M"%)!K6J1@))'hiF#"33HJ!)#"
+`#!!J8#pS!!)!!LpS!!B!"NA[!!)`+J!%N!"5-%-L#&1"2S!J2!!!!4*1Z3!!"0S
+JEIK`)&""k!%3-CF)"!a$IrpR"P*$YN9[K#mYq(!JAk!U6qm!#NcI"$K1GBe$38a
+$8%P$5%9*4dK8!!")jamJ6qrqb#mYq(!JAk!T)'hiF#"35P"[!!(5)'hiF#"32K"
+f!@!!!EiJEILB)&!LEILB)P%k+3!'QQJ!!M"$)!K6J#)m!!!"%Nkj!!!%fL"Yq(!
+J8%(S!4!i-!J+-%3J#&1!jBJJEIK`)&""k!!J)(!)!#"3,fJ!!J!H,fJ!"J!L4Hm
+!(MJU!!DBDJ!#2#S!"*a5-%-J#&1!)M`!!!%56VN!!!6D)'hiF#"33HJ"%0(!3qm
+!*R"$)YK4b2rm-YK&l`!Q5LS!%'B!!)Di4@m!!)!JEILB)&!dU!!#)'hiQ#"30@J
+!"J!#2S4)9dK[!!3r2#!1UHXr43!+5'm!#NK[!!ir2#!1UHY)9dK[!!ir2!!'UHX
+r4J!85'm!&%K[!"Jr2#!1UHY)E`!+5'm!'$mm!!5Tkbm[!"S[,`!D2bm!(%kj!!!
+!`$9!!!42l`!+B')`+J!)8d"R#P0!CbT63'FbB$i`"C!!4%M!)J$JLH#*i)RZLG+
+!iS%JEILB)&!bD!!#dSNdJ@!D)'hiQ#"30+J!!Q!1)'hiQ#"3-#J!"T!!4$5!-",
+34$9!!!*++J!3CJ3e4J!%-%-J#&1!)M`!!!%56VN!!!6D)'hiF#"33HJ"%0(!3qm
+!*R"$)0P4b2rm-0N-3hrrC`K53lC(E`$q3#mYq(!JAk!U6qm"1%cI"2K1GBa$38a
+$8%P$9dP%9%J!!!")jaJ!98pfrhJ!,bhiQ#"IS#P`!G#$*J"C6b"Yq*JJ8#mS!$i
+[!dKYNI9)H!!"5(J!!%Ki!!'Ti#!I*J"+Jfe898mJEILB)&!JD!!q,a"96bm$U'X
+`(cm!,cb#"J!3U,8`(fB`F!(34$J!98m[!kKV-"m`4#))8i%qJ#!m!!!"%Nkj!!!
+%fL"Yq(!J8%(S!4!aP`J')'hiF#"3Z&"R"NU$E!$rF#mYq*JJAk!U9%p-h`!B6R@
++3d&-3e"*3da23`!!!%MR(MK2lrlN+'m"3#C[!6a#,`!&)'hiF#"32""f!@!!!0S
+`3b!)8i!L2!!!!4*1Z3!!"0SJEIK`)&""k!%3dF"$l`!+F%-Lf&()rr`bf%A[!!T
+96cmU!!B[,ILB6VN!!!0`-"mk!&P22bS!"LmYq*Jr2!!)U$dZRbpA!!CC6h!"d%9
+)`#m!F!(348M!,`![,ILB2c`!#DJp)"m`E`!')JL5J$J"98m`"0"U!!3r!#"Yr1)
+`+!!8"%!!%$m!6VN!!!1J-"mk!#m,2a)r"$mU!!)r"DLR98m[,`&',`ZSV4!ICa"
++DJ!19X"%!"p!!!8iJf!1$%0rrfF)8N1f4Qm!rb3IE`!&!8K2l`%F60mFH#"I6qm
+!$%l3L80-580,8%P$9!!!51FI-%r[rXBH,`&D)'m"A#p3!!`[D!!%!"!JE`&J,e!
+!&#pS!!3!'&P2U0JJAbC),`ZSHNK[!"5SHhB!F!(33cB!-%-J#&1!)M`!!!%56VN
+!!!6D)'hiF#"33HJ"%0(!3qm!+("$)YK4b2rm-YK&l`!S1#S!#P922bS!"LmYq*K
+1Z3!!!h!`(c`!@8mr+J!',bhiQ$mm!!LS25pI!!J[E`!)!"aC6h!"d%C)`#m!F!(
+34NM!,`![,ILB2c`!#DJp)"m`E`!F)JL5J$S"5'm!)$m52`8r+J!#-!A3DJ!%2`#
+STbmYq(!JAk!T-%3J#&1!jBJJEIK`)&""k!!J,c!)!#"IS#P96dK[!#*)E`!55'm
+!#ULU%"pR+NS(C`T+"fFL5Lm!1@FF-%3J#&1!jBJJEIK`)&""k!!J,c!)!%K[!#5
+SpM"%)!K6J1@))'hiF#"33HJ!)#m`#!!JAk!U,bhiF#"IS#SJEIK`)&#f8'F)ZQm
+!''m!rXJ[#kKj,`ZSf8r[!6T-h`ci)&p2l`!+6Y#+4NPB8%P$9&9543!!!#m$88p
+96bmYq)5TB$!I)'hiQ#"3)QhiQ#*4-LN!#**3NN!f!8T$C`!!X%*R2`-[,ILBUGd
+JEIK`)&"+8'm!!*T+3fp)5&FJEILB)&!r+!!+)'hiQ#"32bJ!##"Yq*JJ8$mS!!j
+96b"Yq*JJ8$!S!!M33cm!)'hiQ#"32bJ!$%kj!!!$S$!I2`#STf!`5&FJEILB)&!
+r+!!+)'hiQ#"3-#J!$0"$2`!JEILB)&!r+!!1)'hiQ#"32bJ!$+LR)'hiQ#"3,UJ
+!##pS!!`!"%KA5'm!"%)R6VVpMP"2*Kp1GBT"4%T98e4849K8!!!!,`0C6cpm!!d
+!!L"Yq*JJ8#*Yq*JL86!T!!b3!'J!#$k!@8mJEILB)&!bD!"H,`P)H!!",bhiQ$m
+m!!QS25!I-&H3!)Jf!#mYq*JJAk!T)'hiQ#"35QJ!2'pS@8mJEILB)&![+!!q)'h
+iQ#"3-#J!2&0!5-![!%([!!j`!G#))%")8%Ki!!&)H!!!5(J!!DRJ)"p+J'mX@8m
+JEILB)&!bD!"H,`NJEILB)&!bD!"H,`N[,ILB2c`!#DJp)"m`3p#)0J![,ILB)&q
+J+NT$E!jf!#mYq)3r2!$rU9eJ##mYq)4#CkPG,bhiK$m$U@9+3fmD,bhiK#"Yq*J
+J8#*Yq*JL86!T!!L3!&!r!+PM@%mQ(djeN!""4%T98e4@8d056da-3N&5!!!!,`S
+[,IL%U9JNEIcL8)T3LLmYq)3`+J!'"%!!$cm!-"*63$m!U9N[,IL%2c`!%$!U!!5
+3!&)%3!!02`#TA#mYq)5T9b"Yq)3J8%KS!!LT+L4I6R@04NPB9P0$8Np-6%*"8J!
+!,`T46`aY!!'6N!"[@LmYq)#T@#4Yr1*3LP#+,bhiJ$mU!!)`+J!%"%!!%$m!U9N
+[,IL!-#S!"T!!DJ!#"%!!$Mm!2c`!%+PF,bhiJ+PA)'hiJ#"3,UJ!##pS!!`!"(!
+"d&FqJ%KAU5T36b4I6R@04NPB5&0$8Np-6%*"8J!!,bhiQ#"IS#N[,IK`)&qJ+5"
+Yr1)LEILB)P%MD!!3!!JMD!!8!!`JEILB)&!`+!!1"%!!$b"Yq*JJ8$&!!!iJEIK
+`)&!LEILB)P%`+3!+d'J!%#"Yq*JJ8$&!!!SJEIK`)&!LEILB)P%`+3!-"%!!$j!
+!D!!5)'hiQ#"3-8!!$#"Yq*JJ8#*Yq*JL860S!!S!!L"Yq(!J8#*Yq*JL86!T!!k
+3!'J!&#"Yq*JJ8$&!!!B[,IK`)&qJ+LmYq*JJAk!U6R@,4NPB9%9B9&*&3e3!!#m
+Yq*LTd%kkpV"1GBa5480"6%4*8e"-39N!!!")jaJJ*'m!%MJ[!"!`"!4!!"4R%&0
+!Cc*63'G88d"RGQ!!!*K96e92,`UTB$!I"%!!$$m!98m[#UPK-"mr!%kj!!!$Q$!
+I0J"JF&9298m[#UPJ-"m'3!!-2`"96bm+U@)`(cm!6VN!!!1J-"mf!'"+98m[#UP
+J-"mJEILB)&!LEILB)P%b+3!)NQJ!$0*!"N%!$$B"B#496bm+U@!`(b"Yq*JJ8#*
+Yq*JL86)T!!b5D!!)dN!%33!-0J&+4'F+,`Sr!kPM6VVlC%cI""JJAea26Y#+8d0
+56da-9%9B9!!!!#m$0Lm!$!a$!)&Q'P92,bhiK#m[!!j)H!!!U@J`(cB!6VVl+'!
+898m[,IL%,bm!$NKY!SLTD$!I0J!Q(b"IA%p1d)K%6e0$8Np-6!!!!%MR%$"2lrr
+H*'m!0LC[!$)JE`!m5&")E`!%2c`3%+RV,eF!%LmYq*JJAk!T@8mJ8MmS!#![#Mm
+m!!LS25pI!!i[E`!1!"S[E`!D!"j96b"52bJ!)#m+6VN!!!0`-"p)`#B!98pC6bm
+$,`-[#Mmm!!QS25!I,`#SDc!I-Lm!(T*!2d%!(M![!$T63'F'8d"R#Q!1,fm!(J!
+@B!B[E`!D!"C96bm[!"`J8NKS!!LSV4!ICa*96bm[!#!J8NKS!!LSV4!ICPS[#b"
+5)P)`+3!-N!"S!!Jr3!!)5'm!#%K[!!`r2#!1UHY)E`!@5'm!$$mm%!5Tkbm[!!i
+[,`!12bm!%%kj!!!!`#p!!!i[#kPJ-"r3E`!L5-#3!+m!$&"22`#TBbmYq*JJAk!
+U6qm!)NcI$!JJAdr[!!j1d)p63e*26%a648a&3e4*6di!!#m+6qrrmPP2U0JJAb4
+),`USHL"Yr1*)D!!3U(Y)E`!#UA)JEILB)&![D!!)!!B[D!!-!!S`,`!#X'm!"Q`
+1,bhiK$mm!"41Z[e#B"B`,`!#X'm!#Qm-,bhiK$mm!"91Z[dU,`USH5m+U0NII!!
+"!!%IE`!"!"C2l`!1*&p1GBT"99428d056da-!!!!,`SNEIcL8)T3LLm[!!J`+J!
+'"%!!%&*!2`!`+J!%"%!!%$m!2bS!"MmU!!5STb4I6R@,4d984e*29e*&3e3!!#m
++*'hmiP#+8)S[,`!)2bS!!M!U!!3%3!!32`!`+J!'"%!!%$m!-#S!"!4!!""53$m
+!U+FNAdjeMdG&9%G56eG-58j&8N9$9!!!51F!-%r[rr"+,BfPCe3-E3!"Nj!!Eda
+C6kMB)&mN5#m+U(SQEIcL8)Y3LdK[!!J`+`!'"%!!%$m!-#X!"!4!!"!r!$mV!!B
+r+`!%U+G)E`!)U(X[,IcLU33[#UKj,`USf@"+@8qSf#"I*%J[#UKk*QhmiP#,8)Y
+)E`!)-#X!"J4!!"!r!$!V!!3%3!!32`!r+`!'2bX!"+LR5'm!#+Kl,bhmiUN%,`U
+SH5m+U0P)9dkkrXB[E`!%!!`[E`!)!"")E`!-U5T)E`!%6VVql#p[!!J!%#p[!!`
+!&%K[!"#SSdr[!"K-h``!6R@04&*"9e*(8NpA58026J!!,`T2lrrX,bhmiUKc*'h
+miP#+8)S`+J!#"%!!C$m!-#S!"!4!!""53$m!U*0`C0"U!!Br!$!U!!3%3!!38N!
+r!+L45'm!$$!U!!B%3!!39%!r!$!U!!3%3!!39%!r!$mU!!Br+J!%U+G+,`!FC`a
+)E`!-5'f-HULPB$*C6bmYrVir2!#"U"mJAbp)!!J[,`!))&qJ+5m[!!K)E`!3U2B
+[,`!))&qJ+Lm[!!LTSdK[!!``+J!'"%!!%&*!2`!`+J!%"%!!%&*!2`"`&0"U!!B
+r!(!8d'S!"$m!U+G)E`!-U+&)9dkkrCS[E`!%!"![E`!)!"4)E`!3U5T)E`!%6VV
+p`#p[!!J!&#p[!!`!'%K[!"5T+Nr[!"`NAb"I9%p1d)e%8N&A6NG56eG*3dp1!!"
+2lrd!$'d!!C13!'pb-'f6ML!)8i$KL%(YP($4`%K35'hqa%K[!!J[2!!5!)"1Z3!
+!!kKB6dK[!!K)EIl#5'f1XNK[!43r2!!&6VN!!!$J3Hm"'Nr[!"T$l`)!)$`!!!%
+!SLj"lBkb3qm#!#!m!!!"!+)Z,bhmiNK[!J5T'Q!+,bhmiNKYMV+T'Nr[!`"1GBa
+548j"689A58j%6eF!!!")jaJJ6qrrpMJ[!"T)9dKirrp)H2rr5(Mrrdkj!!!$D#Y
+[!!6mh$Y[!!Mmi#mYrXBr2!#!U"mJAb4))!TR!!#D,`SJAk!T,e)!"NK[!!C)H!!
+'6VN!!!1`98p)E`!)6VN!!!2)-"p53$B!Z%0Z#MB%8d2(r!!)B!*f!%K[!!B`3bm
+)6VN!!!1`98p)E`!)6VN!!!2)-"mf!&925'm!#%kj!!!$b$!I1d$mh&925'm!#%k
+j!!!$b$!I1d$mhP925'm!#%kj!!!$b$!I1d$mi#m+)&qJ+Lm+UD02l`!+60m%'#"
+I9%p1d)p-6d&%9dP14%pA3dp-6e)!!%r[rr4)9kKd,bhmiUKc,bhmiUNL)'hmiNK
+S!"#SSb"Yq*JJ8#pS!!J!"#pS!!`!#%K[!!3[,ILBUG-JEIK`)&"+8'm15'm!"%K
+[!!K#*dkkm[BJEBf8)&"++!!*C`C1Z[[NB!JI,BfV6VVmdLmYr1+TD5mYr1+T)bm
+AU(02l`!-6R@3!&934%&848e"58jA58j%6eF!!!")ja``6qrp!$JYr1K64!aY!!'
+6N!"[(LmYr3J`,C11d%3r!$mYr1J`,C13!0"%2`"1Z3!!!iK(lBfB4HhmkPP2U53
+JAl(Yr1*Q!!&!5LX!"'F5,bhp!$m5U6N[,Id!2bS!!UNj5LX!"@F+,bhp!$mU!!5
+T18SV!!0R1#mYr3!r+J!'U6P96dKYM)a)EC!!XMmm!!&1Z3!!!0J3(fF-,bhp!$m
+U!!LT1@!+,bhp!$mU!!LT1NSV!!CR#LmYr3!r+J!+U6N[,Id%2c`!!DNk,bhp"$m
+m!!1T1NSYMCpR&L"Yq*JJ8#*Yq*JL86!T!##`D!!LCJ`[,Id%2c`!"+NkB!S[,Id
+%2c`!"+Nj,bhp"$mm!!@T1LmYr33r2!!'U6T+,BfDCcJ[,Id)2c`!!DNj5&F[2!!
+@!)"1Z3!!!kK"l`!%@%p$l`)!)$`!!!%!SLi[,Id)2c`!!8K[!JDT4`aY!!'6N!"
+[!!%X1Lf6N!"f!@!@,bhp#$!$d%3r!+Nj$%0rrfF!!4"53lC&EqCJ!!%'5LX!"'F
+5,bhp!$m5U6S[,Id!2bS!!UNk5LX!"@F+,bhp!$mU!!5T1NSV!!0R&#mYr3!r+J!
+'U6S[,Id!2bS!#+Nk5LX!"QF+,bhp!$mU!!UT1LmYr33r2!!"U6N[,Id%2c`!!kN
+j,bhp"$mm!!5T15mYr33r2!!&U6N[,Id%2c`!"UNj5Lf0QQG5@8qT*#"IXHhia'B
+m,bhp#$mm!!'T18K[!3![2!!A!)"1Z3!!!kK"l`%%@%p$l`)!)$`!!!%!SLi[,Id
+)2c`!!8K[!JDT4f!+,bhp#$mm!!'T1JaY!!'6N!"[)$SYNj!!GJ&J&#mYr3J`!p"
+%2`#T1Ja$IrpR"P*$YN9[k%r[!`"-h``i6R@18d98689198K*6%P849-!!!"+,Bf
+VCLKC6kNN)&qalIcLCKa+,BfICaBJEILB)&!LEILB)P%`+3!JX'J!)QB),bhiQ+R
+CB!a+,BfIC`B[,ILBUGK1Z[d86R@(4NPB3e958`!!51F3)%AYNIS-8J"NCLjf!@!
+LF!(33dM!8i$PL#"+9)Jb3b)*8i(PL5*+9)NMX!J!'!"53`a$!'0[f'!'F!(38M5
+!-&)J#&1!jBJJ5P5)-Df6MJJ!98m[,IL%U@!`(c"5)JK6JH@*)%T8L$'!'!*-h`3
+)6R@+6%p"4&"*3e*86J!!!%r[rIkS8%K[!!)[2!!2!)"1Z3!!!kK"l`!'@%p$l`%
+#)$`!!!%!SLj)E`%#5'f3!,*)EC!!XNKYN!#bUBY96cmm!)&)H!!!UBB`(ck!6qm
+#!LkI6R@,C'p0C@e"E'9bG$!!!%MR(b"2lrK15Lm(cQF%6VVr$L"Yq(`[%+K45'm
+!!UKd,bhmiUKc1fm(d*11,bhiF#"IS#Pi!@!F-%3J#&1!jBJJEIK`)&""k!!J,c!
+)!#"IS#Y54!a%!$a[hLmYq(!JAk!U98qTP$!I2S!r,C(iUCJ[,IK`)&qJ+6BYNij
+63`C$!)!JEIK`)&![+!!')&qJ)e922bf4q#mYrXSr!dKYrXj#*dkj!!!%#"!ICcK
+C6bmYrY!r!kJI)&mLEIK`)P%M5!!')'hiF#"35UJ!"QB)5'm(bNkkrX`JEIK`)&!
+[+!!'UC*J&PP23UFJ(k%L,SJJAb*Yq(!L850)!!BJEIK`)&![+!!+)&qJ)e922bf
+4q#mYrY3r!dKYrYK#*dkj!!!%#"!ICdKC6bmYrYSr!kJI)&mLEIK`)P%M5!!+)'h
+iF#"35UJ!#QBB@8p#Tb!IS5)ZL#"I)QhiF#*4)dJ!#Q!N)'hiF#"3,bJ!#UQ5B"C
+C6d+R)"qK)Lk))&mLEIK`)P%M5!!+,bhiF#"IS#TC6bmYrYir!kJI)&m[5!Fb)'m
+(-L"3)QhiF#*4)e!!$L0S!!3!%L"["c)J8#*Yq(!L850S!!J!&L0S!!`!'L"["c)
+J8#*Yq(!L840S!"!!(L"["c)J8#*Yq(!L860S!")!"#m["c+TSb"Yq(!J8%*398m
+[,IlLU!d`(cJ!5N4[!!,+)'hiF#"3F!(38#"Yq(!J8$#!)'hiF#"30Lf6MP0$ar`
+!C!C$!-M@8&P2,bhqjMm$U"mJAbp)"c*+V`FbC`!#9%A["4`[,`Fb)&qJ+9P2,bm
+(0UQP)"p4J#B!)'m(-Lp3"kj96dK["l"1Z3!!!mJ`(c9!!!a96dK["l"1Z3!!!mJ
+`(c9!!!K96dK["l"1Z3!!!mJ`(e0!9m"%!"9!!""96dK["l"1Z3!!!mJ`(c9!!!i
+[,`HZ5'S!%Lm$)"mLAb"IS#i[,`Fb)&qJ+Lm["c+TSb"+3HJ!%Lp)"kjC6c"U!!i
+[#%kj!!!!b#!I6VN!!!B!!9J!!3!3!!B!!3!q!!8!jJ!'!")!"`#m!!J!r!!0!%i
+!%!%@98p)E`H`6VN!!!2)-"mf!&925'm(X%kj!!!$b$!I0J"J!!%598p)E`H`6VN
+!!!2)-"mf!&925'm(X%kj!!!$b$!I0J"J!!$Z@8p)E`Hb6VN!!!23,em!"Lp[!!B
+',PP25'm(XNkj!!!$d#pI!!S[E`!+"LjC6dK["l*1Z3!!!p![A`!1,fm!$JBZ5'm
+!%NK["l*1Z3!!!lK"l`!@@%p$l`Bb)$`!!!%!SLjJ!!#)5'm"%NK["l*1Z3!!!lK
+"l`%@@%p$l`Bb)$`!!!%!SLjJC%K[!K*)E`Hb6VN!!!1i3Hm#&PK23qm'-L!m!!!
+"!+)ZB%*)E`-55'm(XNkj!!!$Z%([!aCB6d2["M)J2!!!!3#L,Q!J5'm%%NK["l*
+1Z3!!!lK"l`3@@%p$l`Bb)$`!!!%!SLj96dK["l"1Z3!!!mJ`(e0!9m"%!"9!!"%
+JEIK`)&!b8#!*8i!L2!!!!4*1Z3!!"0SJEIK`)&""k!%3dF"$l`8FF%-Jf9()rr`
+`f8U["c*R'#"Yq(!J8!a3!$aR$#"Yq(!J8,K3CJ$p8NU["c*Q%L"Yq(!J8$!38d!
+JEIK`)&!`J#"Yq(!J8%T3E`!"M(i!)'hiF#"32e!&%RJ"B!!!c(S!2!Gf!@"H-%3
+J#&1!)M`!!!%56VN!!!6D)'hiF#"33HJ"%$*$)JP6JG+"3qm(0M)a'!#bF!J-CL4
+k!6"%)!K6J#)m!!!"%Nkj!!!%fL"Yq(!J8%(S!4!aJ`J+B!`-3hrrC`C53lC'Ejj
++"@C8F!(34ci!-%3J#&1!)M`!!!%56VN!!!6D)'hiF#"33HJ"%$*()JP6JG+"3qm
+(0M1`#!`B!$"%)!K6J#)m!!!"%Nkj!!!%fL"Yq(!J8%(S!4!aK`J+$%4rrfF+8N5
+iE`85E`$r-$S(H!&J!!#D-%3J#&1!d)""l`Ff0M!)!&P2,bhqkMm$U"mJAb4)98q
+TVc!I0J!J#QGH5N0Q@M"%)!K6J1@))'hiF#"33HJ!)#'+#!![,IK`)&qJ+992-%3
+J#&1!jBJJEIK`)&""k!!J5(!)!%kj!!!!U$!I0J![,IK`)&qJ+NT$C`K)E`I+6VV
+j9#m+UD0J#%K["mT1Z[P'$%4rrfF)8N5i4@m!rf3r&kQB@8qSf#"I*%J[#UKk2bm
+(d%kkp"B[,IcLU(0)EIcFUK8JEIcL,fJ!%!88,fJ!&!8B5Lf0T@FB$'d!!C13!'m
+3)'hiJ#"3F!(3D!!)2d!&'%K["45SSdK["44#Td+RU+G)E`88U(X[,ILBUGP#Tb"
+Yq*JJ8$*S!$`[#5mYq*LTd5mYq*LTebmYq*JJAk!T)'hmiL*Yq*JL85+S!"!MD!!
+8!!3[,ILB)&qJ+Nkkl%3[,IK`)&qJ+5"Yq(!J8#mS!!BJAk!T)'hiF#"3,bJ!#L"
+IS#NJEIK`)&!r+!!%,bhiQ+RI,bhiQ+RB@8mJEIK`)&![+!!'6VN!!!"3)"mQ!%U
+$Ee!JEIK`)&!JD!!',a![!dKi!!![,ILB2c`!"kJp@8mJEIK`)&![+!!+6VN!!!"
+3)"p+J'mF3UF[!b"Yq(!J8#mS!!SI2!!",bhiQ$mm!!ZS25mYq*LTf5mYq(!JAk!
+U)'hiF#"3,bJ!"L"IS#SJEIK`)&![+!!+)&qJ+L"Yq(!J8%T3E`K1ZZ6m6VVL*%k
+kl#i[,IL%3QHTBdkkk'K1ZZP3,`USH5m+U0N[,IL%U@dJEILB)&![D!!)"43[D!!
+-"4K)E`88,bhiQ+R65Lf0SfF898m[,IL8,bhiQ$mm!!qS26!I0J!JEIK`)&"+8'm
+J)'hiQ#"3,fJ!#!88,fJ!$!8B5'm&&%K["4K#*dkkjPS[,`!#U(02l`Hb60m%q#k
+I6R@(8d983dK"8!#3"6"!P8+H32D`3(0!c8(,Nd#3!%"83GQ1Z,6SZ2Ihq1K!Vl&
+!dAq!35e!YF4"h(q!q2EiaI6hple!9[Ae3'I[lqrZ36p!Xq8!!!!13R,B35KrFG9
+")VK!S8RU39ATj1Cr[!#3"KIX!K!!!J!!!K!!!"HD51FB!%r[r!!JE`3-3QMqc$J
+YNj!!GJ&J4$!$8d!JE`3--8$rl&923LFJE`335'Mrl#"[""3[+2rS2c`!2+RR%"p
+R%L"["!a`!G"SrX`JE`3--8$qc!a$IrpR"P*$YN4[Z#"["!a+D2l-EaiJE`3-%A`
+!!Ikj)'m%$#mSrp4)H!!"6VN!!!0!B"`JE`3-3LMqZ5"["!`[+2r8,c`!r`!"6VN
+!!!0!)'m%$#mSrp3r2!!'5'm#"MmYNj!!6VN!!!,i@%p)E`)'5'hqmL"[""T)D2b
+-5'hqm%K[!4BJE`3Q2bMqc%kj!!!#q&K25'm"&NKYrZj)E`!H,c`!'`#!6VN!!!1
+S@%p)E`!H)'m%,NKSqia)E`-Q2c`!#%kj!!!!i%r[!#C)E`-'6VN!!!-`)'m%$%*
+Srqa2l`3!60m!'#kI6R@,Ff9d6A0R9'9iG$!!!%MR(#"2lrZ)*'m%M%K[!!LSG(S
+!3Qm%GN(Yr[4$l`-JF!FLf&()rraC6cmm!)4)H!!!5(MrrkPm)&m[5!4F5'm%A#m
+m!"i!""mm!!&1Z3!!!a![,`4FU(0)9bm["'!r2!!&6VN!!!-S,fm!"!01,fm!#!0
+55'm#'#mm!!d!J%kj!!!$U%([!KaB6d2[!"JJ2!!!!3#L,NK[!KJ[2!!1!)"1Z3!
+!!kK"l`)F@%p$l`%B)$`!!!%!SLii,C13!(B"@%pJ*VCYNijQ$M"$)!K6J"@m!!%
+)!'!+-%-J#&1!3M))!!a$IrpR"P*$YN4[eM![!dk3!'m$5NM!)J$QJH#*i)RJLHL
+*dS$SJHQ*-'m$5Y+)2d%$6Lp[!dS$3Lp[!di$4NK[!d)[22rr!!#SUA!"d'm$5$p
+!!dJ`,`03"%!!$cp!!e"`!G"[!d`r3!0-5'm!$%+R2c`!!6mYNj!!U+FrI!!3!a3
+`,`03N!"[!d`r3!-@@8p)E`015'm!&#m[!b"#Cbm["'j#*d)R3LFI2!!"2c`!4+R
+R)&m[5!4`1#f6N!"f!@"%-!063$p!"(3`3b!)8i$KL%(YP($4`%2[!eSJ2!!!!3#
+L,NK[!eY`!"![!eir!#m["(S[,`4k2c`!@+RR$%0rrfF'8N1f4'qi)'m%F#"3%A`
+!4J!N1#f6N!"f!@"!-!063$p!"(3`3b!)8i"+-JJ!Ca3I2!!",bm%GLm["(Br2!"
+FUHGJ%%)R,bm%GLm["(Br2!"FUHF-3hrrC`C53lC%Ela#E`4d(h`!!30"(c`!!5m
+["()r2!!XUHF[,`4`2c`!%+RR,bm%A%kj!!!$B%SYMDaR(&922ccrrdK["'3[2(r
+rrrp)H!!!U'!3(aB!B"+TY&922ccrrdK["'5TF"!I&J"+!fF!!AC96dK["'+TIa!
+IC`!"8&925'm%BMmm!3")E`-Q5'm$ANkj!!!$)"!I&J"`!$!["'"AJ'Bk98m`E`0
+8,`K)E`-Q5(J!)%kj!!!!d"!ICb"+,`0"CaTk!5m["&`r2!!"6VN!!!0)2h`!!34
+DB!!"#(!!-#m%B&f!CN![,`4FU5*)E`0#U+%JE`4F,bJ!'#m["(3r2!"NUHF[,`4
+FUB&)E`5)6VVlELm["&a1Z3!!!f![,`4FU50J!!#q98p)E`4L5'm$)%K["'5TJ"!
+IC`!!U$!["&S-3!!&BJ!!R0"!-$X!"Nll!!)!N!!!$!!-!!`!%J"+HJ&J!!#!1#f
+6N!"f!@!L-!063$p!"(3I2!!",bm%GLm["(Br2!"FUHF-3hrrC`C53lC%EpT)E`5
+)6VVkjQ"',fm%DJ0@5'm$9UKa98m[,`0B2bm%G#m["(Jr2!!BUHF3(aB!5'm%L%k
+kqVKJ'$!["'"63'F+98"R"P9!C`*J"Mmm!!'Tb%S&C`$q6M!["&T63'F+8d"R5&0
+!CdTJEMJYNj!!GJ&J,M!$8d!r3!4d98p#*dK["(J[,`4i2c`!2+RR%"m`3b))8i%
+9J"J!$%0rrfF'8N1f4'r1(h`!!3-CB#a#,`-CB#Bi,C13!(B"B"3`3b!)8i!9[!!
+"#!!-3hrrC`C53lC%EqJII!!"!aN[,`4`2c`!++RR,bm%A+Q$,bm!#+Kc(fm$'35
+3!%r["(K-h`3i,Tp1GBP$5%&38N&14d8!!#m$U&![2-J!!!#Sr992,cbk!!!!U2d
+`(fBf98m[,BfZ,ca5"!5BU2d3(aB!98m[,BfZ,c`U"!5%U2d3(aB!5J0R#"Ym!!(
+mjQ!-3LhmjQ!'2c`!!DR),cc3!!!!U2dQ(djeKd428d9899!!!#m+6qrq!%SYMCK
+R!!0d)'m##%KSmQ`JAb#i!J`JE`)),bMbE%)R5'm!"Mmm!!+Tl5"[!JJ[+2*X(c`
+!!NK[!3C#CkRY4Hf6NM!59d"R$P0!Caj93'F`98"R3Q"@3GFLE`))3qRbHL!m!!!
+"!+)ZB&C"l`%!)Qm##%2TmRSJ2!!!!3#L,Q"!3Hf1XL*[!JK$kI*k)$`!!!%!SLj
+J+N(YME)LE`))3qRbHL!m!!!"!+)ZB"4"lC!!XL*[!JK$kI*k)$`!!!%!SLi`+J!
+#9d"R$P0!Caj93'F`98"R3Q"@3GFLE`))3qRcHL!m!!!"!+)ZB&C"l`%!)Qm##%2
+TmhSJ2!!!!3#L,Q"!3Hf1XL*[!JK$kI0k)$`!!!%!SLjJ+N(YME)LE`))3qRcHL!
+m!!!"!+)ZB"4"lC!!XL*[!JK$kI0k)$`!!!%!SLi`+J!%9d"R$P0!Caj93'F`98"
+R3Q"@3GFLE`))3qRdHL!m!!!"!+)ZB&C"l`%!)Qm##%2Tp(SJ2!!!!3#L,Q"!3Hf
+1XL*[!JK$kI4k)$`!!!%!SLjJ+N(YME)LE`))3qRdHL!m!!!"!+)ZB"4"lC!!XL*
+[!JK$kI4k)$`!!!%!SLi`+J!'9d"R$P0!Caj93'F`98"R3Q"@3GFLE`))3qReHL!
+m!!!"!+)ZB&C"l`%!)Qm##%2TpASJ2!!!!3#L,Q"!3Hf1XL*[!JK$kI9k)$`!!!%
+!SLjJ+N(YME)LE`))3qReHL!m!!!"!+)ZB"4"lC!!XL*[!JK$kI9k)$`!!!%!SLi
+`+J!)9d"R$P0!Caj93'F`98"R3Q"@3GFLE`))3qRfHL!m!!!"!+)ZB&C"l`%!)Qm
+##%2TpRSJ2!!!!3#L,Q"!3Hf1XL*[!JK$kICk)$`!!!%!SLjJ+N(YME)LE`))3qR
+fHL!m!!!"!+)ZB"4"lC!!XL*[!JK$kICk)$`!!!%!SLi`+J!+9d"R$P0!Caj93'F
+`98"R3Q"@3GFLE`))3qRhHL!m!!!"!+)ZB&C"l`%!)Qm##%2TphSJ2!!!!3#L,Q"
+!3Hf1XL*[!JK$kIGk)$`!!!%!SLjJ+N(YME)LE`))3qRhHL!m!!!"!+)ZB"4"lC!
+!XL*[!JK$kIGk)$`!!!%!SLj96cmU!")r+J!8U3)3(fF@)'m##$&U!",bF#"[!JJ
+aDJ!8q(TJ&#"[!JJaI!!"mR!JE`))-A`!#IKk6qm#!#4I,Tp1GC!!Bf&XBdC[Eh4
+PFP0`C@0c-3!!!#m+)'m!##&Yq*cbFL&Yq+$bGL4[!!K&k[*b)'f0VL"3-#J!$!4
+!!%)'3!!+0)!JEBfZ)&!eD!!-!!3NAbkI6R@1Bf&XBdC[Eh4PFNa[Bc)!!!")jai
+`6qrb!%SYMCKR!!9k)'hiF#"35LJ!(QB!"@a&lC155&F[2!!+!)"1Z3!!!kK"l`!
+%@%p$l`d!)$`!!!%!SLj++J!-Ca!JE`iF)Qm1($0SrqMrkQ"@)'m1(%*SrqSi,C1
+18d4f!@!S-%-J#&1!d)""lC1S)Qm1($)TrqV5F!J!)'m1($&"rqS-3hrrC`C53lC
+%Ep3JE`iF)Qm1($!TrqV3D2rS)'m1($&!rqS-8J!(CL!`EC11)!K6J1')3Hf8F0(
+!)Qm1(%2TmRSJ2!!!!3#L,JaU!!F!!QBJ-'f6ML!)8i$KL%(YP($4`#*[$Ka$kI0
+k)$`!!!%!SLi-DJ!(!!4Q)$"YNiiJ#&1!iBK"lC4`dF!LE`iF3qRdHL!m!!!"!+)
+Z$'S!"`!'CL!`EC11)!K6J1')3Hf8F0(!)Qm1(%2TpASJ2!!!!3#L,JaU!!F!#'B
+J-'f6ML!)8i$KL%(YP($4`#*[$Ka$kICk)$`!!!%!SLi-DJ!(!!TQ)$"YNiiJ#&1
+!iBK"lC4`dF!LE`iF3qRhHL!m!!!"!+)Z$&)!"@C'5'm"!#"[$L!r+2rU6VN!!!,
+i@%p)E`%!5'hr&%K[$3K)E`F-2c`!!dkj!!!!i%(["a*2l`!5)Qm1(%2TmRSJ2!!
+!!3#L,JaU!!8!!QC'5'm#!#"[$L!r+2rU6VN!!!,i@%p)E`)!5'hr'%K[$3K)E`J
+-2c`!!dkj!!!!i%([#"*2l`!5)Qm1(%2TmhSJ2!!!!3#L,JaU!!8!"'C'5'm$!#"
+[$L!r+2rU6VN!!!,i@%p)E`-!5'hr(%K[$3K)E`N-2c`!!dkj!!!!i%([#4*2l`!
+5)Qm1(%2Tp(SJ2!!!!3#L,JaU!!8!"QC'5'm%!#"[$L!r+2rU6VN!!!,i@%p)E`3
+!5'hr)%K[$3K)E`S-2c`!!dkj!!!!i%([#K*2l`!5)Qm1(%2TpASJ2!!!!3#L,Ja
+U!!8!#'C'5'm&!#"[$L!r+2rU6VN!!!,i@%p)E`8!5'hr*%K[$3K)E`X-2c`!!dk
+j!!!!i%([#a*2l`!5)Qm1(%2TpRSJ2!!!!3#L,JaU!!8!#QC'5'm'!#"[$L!r+2r
+U6VN!!!,i@%p)E`B!5'hr+%K[$3K)E``-2c`!!dkj!!!!i%([$"*2l`!5)Qm1(%2
+TphSJ2!!!!3#L,L"[$K`r+2*`U)FJE`iF2bMiHUL+2c`!!DL*98mJE`iH5'MbHUL
+--"mf!&92)'m1(NKSmhUSM$!I2!"96b"[$Kj)D24kU)``(cS!98mJE`iH5'MeHUL
+--"mf!&92)'m1(NKSpRUSM$!I1!"96b"[$Kj)D2GkU)``(cB!)'f0VL"35'J!#+K
+l*Qm1(%IVmR)r+`!#)'m1(M!6d'MiHMm!U*-JE`iF5'MbHUL%-'f6M#!)i)MJL1#
+)lSM3L1+!-'X!!Y#)-%BL#1#*i)RJLHk*dSMLJC!!J6m!)'m1(M!6d'MiHMm!U*-
+JE`iF5'McHUL%-#X!"T!!46m!)'m1(M!6d'MiHMm!U*-JE`iF5'MdHUL%2bX!!L"
+[$Ki`+2Kkd%$38dM!)'m1(M*Sq(SL#H#*i)RJLHk*dSRLJG+!2`'SNb"[$Ka)D29
+kU)3`EC1-)!MJL1#)i)MZL0#)iS!`D`!#d)J`4#))i)RJLH#*lSR5L1+"N!#"2`!
+JE`iH-#MiHY"!d&0)`#"[$KibD2Kk)JRJLH#*i)RZLG+*iS(5J$m"U*-JE`iF5'M
+fHUL%-#X!"T!!3cm!)'m1(M!Sq(V330"65-!JE`iH-QMiHL)*i)RJLH#*lSR5LH+
+"dS!r!DL6)'m1(%KSphUSK#C[$Ka(kr*b5LS!$QFU5LS!%'F)5'f-DULGB!C)EBa
+bU*dr+`!#2a1SNcmV!!Br%kL45'f-FULG6qm1!%cI$(JZRdjeM("bD@jd4Qp[G'9
+b-`!!!%MR(`"2lr*SU&"+,IcQCJ41Z[AZ5LhmjQF!"d)-E3!"Nj!!CL)II!!""LK
+f!Q!3-%-J#&1!3Hm'+%)`#!"53`a$!'4[kQ!398p)E`BU6VV`i"!IC`!(#$JYNj!
+!GJ&J'M"$)!K6J%(["LK+-!J!C`)k!`a$IrpR"P*$YN4[iLmmb!!!!+Mp98m[2,S
+!!!#Sr6!ICJ!'`P92,bf0VLmm-J3%L+Mp%"pR!!DZ)'hiI#m3U&&96bmmZJ!!!+M
+p-"pQ!!B+,bhmiUKc2ff6MJ!%98m[,IL%U@!`(cp!!!BJEILB)&![D!!)!!J[D!!
+-!!`JEILB)&![8!!3,fJ!"!!8@8mr2!$)5(J!!%KirrqTI#"I,dJ,M%K[#ia)H!!
+&(c`!!8kj!!!$%#mYr1*#*kN),bm,M+Kc)'f0VL"3$#J!!3"%CL4)E`Z8,c`!#!#
+!6VN!!!1S3Hm,Q&K23qm(M#!m!!!"!+)ZB#*)E`Z8,c`!"`#!6VN!!!1S3Hm,Q&K
+23qm(M#!m!!!"!+)Z5'm(M%KYN!#b5'f3!,*)EC!!XUQ,,bm,M+Q"@8m[,BfZ5(J
+!!%Ki!!![2!3!$!#Sr5"I,dJ,N!!q"A`"B!!%IMY'Nij+,C1HCa3`EC11)!K6J%(
+["LK+-!J!C`!"BLm[#ibSFdK[#j3[2!!*!)"1Z3!!!kK"l`ZB@%p$l`b8)$`!!!%
+!SLi`EC11)!K6J1')3Hf8F0(!5&")EImX5'm,R#mm!"X!J%kj!!!$U&K25'm,R%K
+[$+")E`LF2c`!"%kj!!!!i%([#+*2l`!@3qm-P#!m!!!"!+)Z5'm(M%K[$*K)EC!
+!XNKYN!#bUBX[,`Z-UB%[,ILB)&qJ+5"Yq*JJ8#&Yr1)!8LmYq*JJAk!U,bhmiUK
+c2bf6MN)R6VN!!!,J6VN!!!)J,bhiQ#"IS#NJEILB)&!JVILF)@hiS!!%)'hiQ#"
+3)@hiR!!))@hiS!!-)'hiQ#"3-$`$k0"S!!iJEILB)&!a3!!1)'hiQ#"3-#J!#J4
+!!qJJEILB)&!a3!!+,bhiQ#"IS#S[,ILBUG!JEIK`)&"+8'm56VN!!!*!6VN!!!)
+`6VN!!!)i6VN!!!)S5'm0V%kkmcC)E`fX6VVfc$"YNiiJ#&1!3Hm'+%S`#!"R!!,
+5-'f6ML!)8i$3J%(YNkJk-!J!2h`!!3f8B!!#R#m[#ibSFdSYNjjR#$p[$C30PQ!
+q3Qm0PMJYNij64(B"B#!`3b!)8i$3J%(YNkJb,`f@dR!)!$p"$CB-3hrrC`C53lC
+%Ep``,`f@d'm0P$p!$CBJEBfZ)&!-+!!"!%4Q*%K[#j3[2!!'!)"1Z3!!!kK"l`Z
+B@%p$l`b8)$`!!!%!SLjJ)NK[#j3[2!!%!)"1Z3!!!kK"l`ZB@%p$l`b8)$`!!!%
+!SLj)E`Z8,c`!#J#!6VN!!!1S3Hm,Q&K23qm*M#!m!!!"!+)Z5'm'M$m[$CT1Z3!
+!![KB6dK["Sa)EImd5'm)P#mm!"X!J%kj!!!$U&K25'm)P%K[#CK)EIm`-'f6ML!
+)8i$KL%(YP($4`%K35'hr,NK[#l![2!!E!)"1Z3!!!kKB6dK[#l")E`bd5'm+X$m
+m!!P1Z3!!!1""l`Uf6qm!+N2[$*3J2!!!!3#L,NK["ia)E`bB5'f3!,*)EC!!XUQ
+,,bm,M+Q",bhiF#"IS#PC6c"[$CJJ#&1!jBJJEIK`)&""k%&)FJ(5F!J#5-%[!6"
+[$C`J#&1!jBJJEIK`)&""k%&)FJ(5F!J!5-%[!5mYq*Jr2!!*U$dJ(cB!,bhiF#"
+IS#S[,ILB)&qJ+5"Yq*JJ8$!S!!M33b"Yq*JJ8$&!!!`JEILB)&!KE`Z3!!"5,bh
+iQ#"IS#SJEILB)&![+!"5U(0)EILFU(X[,ILBUGN[,`Z3!%Ki!!![2"!!#!LSr5"
+Yq*JJ8%KS!!J[,ILBUG-JEIK`)&"+8'mB5'hiR#"Yq*JJ8%KS!!JI2!!"6VN!!!*
+35'm0V%kkp*B[,`Z3!#mm'!!%$+Mp,bhiQ#"IS#NJEILB)&!KEIcL!&)[,ILB)&q
+J+N*R-!0%3$m!,bhiQ+RG$'prr`f8C`a5E`f8ZQm0P'`!r@"96bmmZJ!!!+Mp-"m
+-3!#!Cb"96bmmZJ!!!+Mp-"m-3!#!C`i-4RrrC`K54Va(E`$lJ#m[#j!!,c`)!!5
+%U2dJEBfZ)&!-+!!"!%4QDP92,cbk!!!!U2d`(fCF,bm,M+Kc5'm,P#mm!!8!J%k
+j!!!$U%([#jKB6d2["i`J2!!!!3#L,NK["ia)EC!!XNKYN!#b5'f3!,+TLbm[#ib
+TJ5mYMDj)H!!!5(J!!%Ki!!![,`!3,caJ"45!U2d[,IcLU(-JEIcL5'J!%+Kl,bh
+iQ#"IS#NJEILB)&!KEIcL!&)JEILB)&!KE`!)!!JKE`!-!!`JEILB)&!JV`!3)@m
+!&!!%,bhiQ#"IS#Sr,`!%3LG1Z3!!!Z![,IL%2bm!#UPM6VN!!!*B,bhmiKmm!!'
+T##m[#ibTJbmYr1+T(bmYr1+SFbmYq*LTf#mmd!!!!+Mp6qm0Q%cI!2K1GBG%6e"
+558j8!*!&0%"@mE$XSBk(ZSZIld&RIib`NSe$+d'&fC!&30(CN!9#I%+[I`RQiqr
+ZIbINIlrZ3Djqc8*ZIEq$[)1$Jd#,3,e!Z3#3#J&`!C!!!!)!!!'3!!!!!@")jaJ
+!6qrp!&92,bhp#+P3-"p63$J!GJ&J'LmYr3K96bmYr3LT8$!I2`#T8Ja$IrpR"P*
+$YN4[iLmYr3K)EIpdU6-i,C13!(B"B!!!P!a$!!TX0NKA2`01Z3!!![KB6dKA5'h
+rGNK[!3Jr2!!#6VN!!!$J3Hm"$Nr[!!j$l`)!)$`!!!%!SLjJ"Mpm!@%#!#mYr3K
+)E`)%U6-[,Id)-!083$m!-%-J#&1!iBK"lC4`dF")8+P(,bhmq%KYrhUT-bmYr2J
+r!c"$)!K6J1')3Hf8F0(!5&#T4`a$IrpR#&*$YN4[!2pU6qm$!%cI!"K1GBp$8N9
+"9%9$5%&3689199-!!%r[rZ`JE`%B3qm!&(!r)YK4b2rm98p)E`!@3QG)E`!+6VN
+!!!"i-"mqJ%TA9m"%!"p!!"-IE`!6!4a2l`%8,Tp1GBp'98a-8%&85&p&@%P69&-
+!N!8$XSY!@J#3#JL+!B!!!J!!!B!!!!K'51FB)%r[r[iNE`%5)'m"'N2[!!*`2b,
+B8FMrr$"5*JKi!"J[!!*)a%U%EbKC6bm[!4S[!dK[!!m["%Ki!!")H!!"UH!J(bB
+!98m[!kKV-"mdJ'!%0,crr`a5rrpH`%3!(d!!!4p[!!%"(Nr[!3*-h`3B)&p2l`!
+-6Y#%4NP14!!!!%MR(c"2lrm!*Qm"*"km!2m[%b"IS#PC6bm66VN!!!"3)"mZ!#"
+6*K!N3bSm!!!!rb!()M`!!!$r6VN!!!9U2!"i!@!q,`T)E`!&,`8J(b*I)&qJ,NK
+A3LG1Z3!!!&K)E`!",`S["5!I)PmJAk!Z)$`!!!$rd)-Q!#4$$%4rrfF'8N5i4Qq
+q)!FL2!!!!2p1Z3!!"HJU!&92,`@SDc!IFJ!b!"k",`T)E`!&,`8J(b*I)&qJ,NK
+A3LG1Z3!!!&K)E`!",`S["5!I)PmJAk!Z,bm")%)R6VN!!!"B,a-JAk!U6qm"!%c
+I$2JJAe"26Y#*980"8d9)6N4-!!")jaik6qrqj#4[!8SXE`&'+'m"3NK[!!+SG#m
+Yr1+SFdIYM)`J5d2[!"JJ2!!!!3#L,L"Yq*JJ8#pS!$i"'&925'm"'Nkj!!!!U$!
+I0J"++`%!CJa)E`%B5'm!(%kkrUJ`8LB)1+f6MP925'm!'Lm[!4i[#NkkrJi3(aJ
+!5J4Q)%SV!3&Q'NU$EaC#8P925'm!'Lm[!4i[#NkkrHS3(aJ!,bm"'#"IS#0+"'B
+!!)T++`%"C`!!JM!YNik`EC13!'afI!(FEC111Lf6N!!f"Q"N2bf4q+QB1!064!C
+%!)"C6bmYrh`r"+JI)&m[5!%B,bm"'+Q55LX"!'B-5'm"'%K[!"a1Z[i%3P*96dK
+[!"S[,`%H,`T1Z[e`%"mB!#m[!4JJAk!M5J4R"$L$B!`-3hrrC`C53lC&EjK+"'C
+f5LX"!@G`1Lf6MRB"B'3r,C(iUCJi!e0%"N3!J&P2,bhrJ$m%U"mJAbp)!4J[,`%
+BUC*++`%!CJa)E`%B5'm!(%kkrBT#8P925'm!'Lm[!4i[#Nkkr2B3(aJ!,bm"'#"
+IS#0+"'F%1)0J$!a$IrpR"P*$YN9[Q%S%C`!!T$!8X'f6MQFH5Lf0T@F),bhiJ$m
+8U@-r&%)R6VN!!!,J6VN!!!,3F!!3,`!Bd&)mJ$"5,`J`9Lm),bhiQ+R45Lm"3'G
+H,h`rrXc-!!B[I-b3"!!+2hc-c3!15'm!"Mmm!!)[,ILB,bhiK%kj!!!#Q%kj!!!
+#@#"Yq*JJ8#pS!!J!%#pS!!`!&#"Yq(!J8%T3Ea")E`!35'm!&%)R6VN!!!*3(d3
+!!5m[!!+SFap[!!%"6Nr[!4a-heai)&p2l`!16Y#+4NP14&088NP14`!!!%MR%#"
+2lr[`U&"f!%K[!3#SG&P22c`"-NKi!!")H2rrUA`JAbp)"!`[,`3-U(-[,`3-5'm
+#$#mm!"-!J%kj!!!$U&K25'm#$+ND5'm%$#mm!"i!""mm!!&1Z3!!!a"&lBb-5LS
+"!'F@,bm%$#mm!!3!"$mm!!41Z3!!!j!!B"3[,`3-,c`!"2qF2c`!"%kj!!!$N!!
+-E3!#Nj!!E")[,`3-,c`!r`!&6VN!!!0!B$"++J%"CaB[,`3-,c`!"3!&2c`!"8k
+j!!!$N!"J&#m["!`[2!!&rj`r2!!&6VN!!!13!#m["!`r2!!$,`T1Z3!!!c![,`3
+-5(J!!cmm!qLTIP92,`T)EC!!XMmm!!&1Z3!!!0J3(fFD,bm%$%Ki!!&1Z3!!!d!
+JE`3-F!%K3!#BB"J[,`3-,c`!r`!"6VN!!!0!)'m%$%+S!*K)H3!!!eK)E`--UC%
+`,`-)6VN!!!B!!L3!!3(e!!B!!3#)!!)!pJ!$!2J!"!'8!!8"cJ(d!!B"p3!S6VN
+!!!,)5Lf0QQF3)'hia%SS!'jR"Nkj!!!###m["!bSFf!!!G`[,`3-U(-[,`3-U5)
+[,`3-UB%[,`3-6VN!!!0J,bm%$+NM6VN!!!,)5Lf0QQF3)'hia%SS!'jR"Nkj!!!
+###m["!bSFf!!!C3JEILB)&!rD!!L!`T)E`)),bm%%$mm!!01Z3!!!cK"l`)-@%m
+L5L!m!!!"!+)Z)'hiI#m3U&&96dK[!`a)E`%+5'm"%"mm!!&1Z[Y'%"pR##mYq*L
+Tf'!'2c`!"DR),bm%$%Ki!!-r2!2SUAkS8'!!!5*f!@!!!4a)E`%),bm%%$mm!!0
+1Z3!!!cK"l`%-@%p$l`--)$`!!!%!SLj96dK[!`i[#Mmm!!&1Z3!!!0J3(fF!!1"
+#Td+R,bhiQ+R43Hm$$#*+)$`!!!%!SLj96bm+5'f3!,)r2!!"6VN!!!$B%"pR(#m
+["!a)H!!"6VN!!!0!)'m%$(!")8!!Q'!!!*B[,`3-,c`!r`!"6VN!!!0!)'m%$%+
+S!*KJHK!U!3"A`%3!&8!"!%SU!3"R&Lm["!`[2!!%!!3r2!!%6VN!!!13!'"5,bm
+%$#mm!!6rR$mm!!41Z3!!!j!!B$`3+J%"9m"%!"9!!3&++J%"CaB[,`3-,c`!"3!
+&2c`!"8kj!!!$N!"J&#m["!`[2!!&rj`r2!!&6VN!!!13!%S$C`$p`NKA,bm%%$m
+m!!01Z3!!!cK"l`!%@%mL5L!m!!!"!+)Z,bm%$+Q$,bm"!+Kc6qm%%%cI"!K1GBC
+%6dC*6N3!!!![#Nr[rrBNE`!55'm!"+Kd)'hiQ#"32fJ!)J!))'hiI#m3U&&96dK
+[!!T)E`!'5'm!$"mm!!&1Z[Q!%"pR$#mYq*LTf"5m!!&J$%S5CJBr2!!&UFK#%UK
+3,bm!"+Kc6qm!#L4I,Tp1GBY%6dC*6N4"4d&*6J#3"5C!98"GmY"!Fd$'Jk@$PVL
+13Brel29qf[AQp8%qmAm`mXDK31lSIcUH3%(FVpb631TrFFS!!!!$3'5V3L)!N!B
+#%J%S!!%!!!%S!!!#"&92)'hiQ#"3)QhiQ#*4-#N!)T!!D!!J2S!r9`!'9%p1GC!
+!4d988d9-480858p18dPD43!!!&&2)'hiQ#"3-QJ!)#"Yq*JJ8#"S!$iJ%0#*,S!
+[9`!%,fm!"!!-8%p1GC*(494648a&3e4&4&4&@&439&)!!!")ja!`6qrriL"[!$*
+$eb,B)YJLf#,B@8qSf#"I*%J[,`!Z,`USh%K[!"*#TkL!5'm!%UK`,`Sr,`!B2bm
+!'+MJ98m[,`!-F#1Vl4!ICJK#,`!4B!!"%&925'm!'(!&Uqd`(cB!98m[,`!B5(J
+!!5mYrkaC6dkkrdSJAbm)98p1Z[m--"p)`#m!3UG`"k[Y-"mf!&P2,bhiQ$mm!!D
+S25"I,dJ!'Lm[!"SJAk!T98m[,`!B5(J!!5mYrl!JE`!S,a"C6bm[!$"1Z3!!!&!
+J(bm!3UG`"k[Y-"mf!#m[!"SJAk!U,bm!'L"IS#096bm[!"K)H!!")&*)D!!#F"D
+Vl6!I0J"C6kMB)&mQ5#m+,`ZSh#m,,c`!!3!"U1%[#Lm,,`USjLm,U0P96bm[!"K
+)E`!',`T`$D[Y-"mf!%T$C`i-3rq!C`JII!!"!"&J'&92,bm!'(!'Uqd`(cB!,`U
+Sf4pm!!%!%4p[!"%!0Nr[!"j-h``))&p36dl3L%4538G849K8!*!'!8#N!*!+'KX
+!m!!(!!!!m!!!'8j96bmYr1+SFbmYq)4#CkPG,bhiK+PY)'hiK#"35'J!#+NU5Lf
+0SfF898m[,IL8,bhiQ$mm!!qS26!I2S"+,BfPCb)-E3!"Nj!!EaS[,IL!3QHTA5m
+Yq)#TE5"Yq)!J8%KS!!LT+L"YMC3J8%SS!!PR#%kj!!!#U'!)3LG1Z3!!!V"86dj
+eP%&$9%P@394&8d056da-9dP14%pA!!!!,bhmiUKc,bhiK$mm!2qTA5"Yq)3J8%K
+S!!LT+NSYMD9R(JaY!!'6N!"[&LmYq)!r2!$rU9dJEIL!)&")D!!)U5SJEBf8)&"
+++!!*C`K1Z3!!!UKJ#Kmm!!&1Z3!!!V"1GCC%48&$9%P@394&8d056da-9dP14%p
+A!!!!51FF)%r[qriS,`3@5S4R!!*598m["+KU-"mk!&92,`5SDc!I0J!`"90!CaC
+63'F!!)T63'F!!A"63'F!!C4J!!)H$%-!!f`16VVr2%kj!!!$J'!!!JS[,Icm2`0
+)E`-)U8C96dK[!`5TYM!I0J"96dK[!34)E`-)6VN!!!-!@%p)E`%%2c`!!R!!%#m
+$#P0!2`")E`)-6VN!!!$S5'm#"%KYrl4#Cdkj!!!!f"!IC`!"VN)Yr1CJ!!'Q4Hh
+mkVC5CJj1Z[l#6VN!!!)3B!!"N!#fDJ!#CKT1Z[kZ6VN!!!)B5LhmjQB!!AK1Z[i
+!B!!"F,CU!!4Q%%kkrSj#*dkj!!!"-'!!!9UfDJ!'CLT1Z3!!!B![,IL%U@e+,Bf
+PC`i-E3!"Nj!!E`B[,IL!U@e1Z3!!!Y"J!!%UYQS!#'BB3Lm"!8K[!3&1Z3!!!BK
+1Z3!!!Y"J!!%-YQS!#QBk6VVq+NK[!3)[2!!#!)"1Z3!!!kK"l`%'@%p$eb!m!!!
+"!+)Z(c`!!8K[!!*)E`-)6VN!!!&!B!!!c,CU!!aQ!!$%'h`!!IcRB!!!ZP92-!0
+63$m!UF)3(fB!!+S-3`!%CJ!!SPP2UI`J(bB!,bhiQ+R9B!!!N!!-3`!"CN"+,Bf
+DCcTC6kNN)&qalIM%CJi[,IM%U4B[,IL%U@eJD#mYq-5T&5mYq-5T(bmYq-5SFbm
+Yq-#TE8kj!!!#d'")YQhmk'e#-!13!'hmk&*!X'f6MQFd5Lf0T@F5,bhiJ$!Yr1K
+63$)$NN!r!DPM-#hmk&0!-J153$m"(c`!!8kj!!!#i%kj!!!#d%*RU6K2l`3#60m
+%1#kI6R@,8&*23d968de&6P8!!#m+6qrqp#"[!4K$l`!%F$mLf&()rra)9kKd4Hm
+"&%K[!33r+J!#2a)`2!$)d'S!!Mm!F'638Mm!U+GC6dKi!!")E`%-5'hr[%)R2c`
+!!dKirrp#*d+RU4-JAb4),`USFcmm!!'SKcmm!!QSLLm+,bm"'"mm!!&1Z3!!!`J
+[DJ!3!33[DJ!8!3K)E`%%,c`!"3!&U+P)E`!&F!!3,`!)5-![!%K[!3a#CkR16VN
+!!!-B,`UT&#mAU(02l`%-*&mJAe"26Y#+4%p65%pA6Np843!!!%MR'#"2lrl`)'m
+")%2AF$mLf&()rr`[EIqq!3K#V`%-,fhr`J%!3Um""&P2,bhraLmYrmT`)DJU)&m
+N5(J!98m[,Ir15'm!"h!!%#m!#NM!,`")E`%@-$`)*DJ@-"mf!&P2,`T)E`%3,`3
+[,Ir53UG)E`%B,c`!&!B$F!#S+L!I0J![,`%-)&qJ)e925'm"#M!m!J5S&M!I0J"
+96dK[!3)`2!)%U"B`(cB!6qm"%%cI""JZRdjeL%428d0559"8!!!!98mJE`!'5'M
+rb$!m!J5S&M!I2`"8Me92)'m!"NKSrp!`2!)%U"B`(cm!9)p96b"[!!C)D2r!-$`
+#"+J@-"mr!&52,Tp1GBK$E'9KEP9`-!!!!%T[!!KR*L"[!!3aE`!)rVi[,`!%6VV
+rQ$mm!!'Tb$mm!!'Tb#j[!!41qJ'd)&pF6dl3L%CKD@a&FR)a!!!!6qrqUL"[!9T
+$l`!@F$mLf&()rr`JE`&H,e!!"#pS!!3!##pYrpB"(N+[!5)[EIrD!5C#V`%U,fh
+rhJ%@3Um"'N([!5l3r!!S51!r1P92,bhriNK[!A")H!!%5'm"*$!m##@S&M!I2`"
+)E`&B6VVr9%([!5l3r!!S51!r1P92,bm"D#m[!@K)E`%J2ccrrd+R5'm"-M!m#a5
+S&M!I2`")E`&B6VVr(N([!5l3r!!S51!r1P925'm")#mYrqB[,IrU5'm!*A!!%#m
+!+%M!,`!`2!S2U"B`(cm!5'm"@%kkrZ4"l`%Zd2`!+%MJ2cT96dK[!5")E`%X5(J
+!!d*R5(MrrdKi!!")H!!!-$`0&kJ@-"mr!%K[!9K1Z[kU98p)E`%S,bhrlLmYrr*
+)E`!D5'm!%NKi!!4)E`!U-$`1%DJ@-"p"l`%Zd2`!+%MJ2cT96dK[!5J[,Irf,bh
+rqNK[!"S[,`'!5(J!"%K[!#S`2!i4U"B`(cm!5'm"@%kkrNK)E`&@6VVplN*[!"4
+96dK[!!Br2!!lU)m`(fF'2c`!!DR)B!a2lrkU3Hm",NcBA2`rE`!8!A*2l`&@)&p
+2l`!B6Y#)389648j%388!!!")ja`J6qr`SM"[$h)J#&1!)M`!!!%56VN!!!6D)'h
+iF#"33HJ"%0(!3qm,+("$)YK4b2rm-YK&l`XS)%T"k!!5,dJ29PP2-'S!$Lm)6VN
+!!!$))"m-3!!3BJ!'VY"!-$X!"Nll!!)'SJ#`!aJ#%J)d"#`!)J-Q"6`&iJAd"P!
+'GJ)q!C`"f!,N98p1Z3!!!9!3(fF'6VN!!!&B98p)E`pB6VN!!!2)-"mf!&925'm
+2@%kj!!!$b$!I8d"A`%3!'!"+,BfJCa"C6cmm!)#U'b"I,`LU('!1@8mr2!#!UEN
+JAbm3U&%r!amm!!%I"%kj!!!"H%S%C`!'%Nkj!!!$'&926VN!!!&3%"pR!!Aq6VN
+!!!&BB!!&p&925'm2@%kj!!!$b$!I0J"96dK[$eK1Z3!!!mJ`(cS!5N0[!!A1YQf
+6N!"Z!!A'YQf6MPE!4!!B!%S%CaT+,BfPC`J[,IL!2`1TBcm$(c`!!8kj!!!#i%T
+&E!C+"'B!!)496cm&,bhiQ%kj!!!$H$!I1J"C6cm&,bhiQ$mm!!LS25pI!!J[E`!
+)$eT96cm&,bhiQ%kj!!!$F$!I0J![,IL%@8p`!G"$5-![!(!"d%0)`#m!,bhiQ$m
+m!!QS25!I,d!!"&92,bhiK+PJ-"r3E`pH5-#3!+m!"&@!2`#TBdkj!!!#@%kj!!!
+#d'!!"3J`,C11X'f6N!"X!!6m5Lf0T@F1,bhiJ(!"d'f6MMm!U@0`!G"YNiir!"m
+m!!&1Z3!!!Z"1Z3!!!Y"J!!6-$'d!!C11E`!%`NSYMD9R$LmYq)!`,C118d!r!+P
+M-#f6MP0!2`!I2!!"6VN!!!,J6VN!!!,3B!!%NNSYMCaR!!5+6VVfQNkj!!!#'%S
+Yr1CQ!!4i6VVel'!!"(!EI!!"r1GJ!!4Q@8p)E`pD6VN!!!23,em!$#p[!!`05PP
+25'm2@Nkj!!!$d#pI!"![E`!3$$TC6dK[$eT1Z3!!!p![A`!8,fm!&!`q5'm!'%K
+[$eT1Z3!!!lK"l`!F@%p$l`e@)$`!!!%!SLj+,BfLC`!$r&92,bm06%K[$%K1Z3!
+!""!3(fF!!qC96dK[!!B[,`e3,bm-4#m[$%a)E`a85'm0E%kkq[B`(cB!B!!$`%K
+[!4K)E`pD6VN!!!1i3Hm"(&K23qm19L!m!!!"!+)Z)'hiI#m3U&&)E`j@6VVjE'!
+!!ia1Z[@F6VN!!!1!B!!$INSYMD&R!!$f98p1Z3!!!9!3(fF'6VN!!!&B5'm#'%K
+[$eT1Z3!!!lK"l`)F@%p$l`j@)$`!!!%!SLj96cmU!!B[,ILB6VN!!!0`-"mf!&P
+22bS!"LmYq*Jr2!!)U$d[A`-B,fm$'!pD98pC6h!"d%0)`#m!F!(33dM!,`![,IL
+B2c`!#DJp)"m`E`pF)JL5J$m"2c`!+%kj!!!$Q$!I2d!2@Mp5$ea)E`e12a)r,`p
+J2bS!!M![$f63DJ!%2`#STdK[!aa)E`e56VN!!!,`,fm$)!e5,fm$*!e@5'm2AUK
+`6VVdVNK[$PSr,C(f5'm0@%kj!!!"S&K2B!!#JMmm!!'Tb'!!!RK)E`-N5'm2@Nk
+j!!!$Z%([!bKB6d2[$PBJ2!!!!3#L,P925'm1@%kj!!!"Q"!ICcC)E`3N,c`!!J#
+!6VN!!!1S3Hm%+&K23qm09L!m!!!"!+)Z3LG)E`eB5'm1A%kj!!!"3'!!!K)r2!!
++UFK)E`NN,c`!'J#!6VN!!!1S@%p)E`NN5'm)+#mm!"N!J%kj!!!$U&K25'm)+%K
+["ba)E`jL6VN!!!2J@%p)E`FX5'm'-#mm!"J!J%kj!!!$U&K25'm'-%K["63[2!!
+8!)"1Z3!!!kKB6dK["64)E`aH2c`!"8kj!!!!i%([$'42l`!D3qm09L!m!!!"!+)
+Z(c`!!8K[$9K)E`jF6VN!!!&!B!!"D%K[#L4)E`pD6VN!!!1i3Hm++&K23qm19L!
+m!!!"!+)Z98mr+J!',bhiQ%kj!!!$F$!I0J"C6cmU!!B[,ILB2c`!#+Jp,em,*#p
+[#b32@P92@8p`!G"$5-![!(!"d%0)`#m!,bhiQ$mm!!QS25!I-'m2A#))NS!r!6m
+m!#K1Z3!!!jJ`(cp!$eSr8JpF5'm2@UK`6VVbjNK[$PB[,`pH6VVed'!!!-*1Z[,
+5(c`!!8kj!!!"-'!!!,"&lC(k5P*[!!#Q-&)J#&1!jBJJ5P5)2c!)!%)R6VN!!!,
+J5Lf0T@F+,bhiJ$mYNikTBdkj!!!#d#mYq)3`8L!)8i$PL#"+9)Jr-!J#U@01Z3!
+!!PJ`%P0!0)"J8NSYMCTR6#mYq-5T&5mYq-5T(bmYq-5SFbmYq-#TE8kj!!!#d'!
+X5Lf0QfFQ6VN!!!'!,bhiK+PY5Lf0T@F1$'d!!C13!'m',bhiJ+PY6VN!!!,36qm
+2ANcI"$JJAe426Y#25%&14%a&8%P$9%0-580,!!![!hB!-#m!#!4!!"4R"P0!Ca*
+J)!aY!!'6MQmB0Lf6MP0$B"!`,C11X'f6N!"X"RB"eQf6MNT$Cb![,`!+2`1TBcm
+$(c`!!8kj!!!#i%KYM"DS88kj!!!#d#BI)&pF6dl3Le0$8Np-6%0)39"6!!")ja`
+J6qrqb#"[!8a$l`%B)YJLf#,B)YJ[E`%L!6"96bm[!6*)E`%kU5``(cB!-!--3!!
+)BJ!'f0"!-$X!"Nll!!)'c!!5!#B!0!A#"!B'!!C+"NTC6bm[!65T25!I,`"1Z['
+HB!!'U%K[!4J[,`%iUE0J!!DD@8qT*#"IXHm"0'F+,bm"0+NIB!!'K#"[!65alIc
+LCJ!$CNSYMCpQ"LmYq*LTf8K[!6#SF992,bm"-Lm[!6T)E`%HU@``(cB!5Lf0T@F
+!!Hi-E3!"Nj!!E`!"j#"[!45alIL!CJ!"f!a$!)&Q@#"Yq)!J8#"S!"`J8#&[!6!
+!5P92,bhiJ#m[!6C)H!!!U@J`(cB!98m[,IL!U@!`(l"YNijR!!Af98m[,IL!U@!
+`(cm!(c`!!8kj!!!#i%kj!!!#d'!!"GB-3`!8C`B-3`!9CKK96bmYq)![,`%f5'd
+"!+PS-"mf!'!!"E*96bmYq)![,`%f5(J!!+PS-"mf!!a$!"jQ-P92,bhiJ+PJ-"q
+`EC11C`!&KP92,bhiJ+PJ-"mr!"mm!!&1Z3!!!Z"1Z3!!!Y"J!!9Q$%-!(fBS5Lf
+0QQFL,bhia+N9,bhia+NI,bhia+Kc,bhi`+PY6VN!!!,3B!!&1!a$!#*QANAYNIT
++8Qm!"5J`8L!)8i$PL#"+9)Jr-!J!3LG1Z3!!!Z"+,BfPC`S[,IL!2bf6MUPM6VN
+!!!,3,bhiK$"5)!K6J1@))%T8L$m`#!+TBdkj!!!#@$!58d!dJ'!!"03-3`!JCM4
+96bmYq)#TB$!I$%!!!@m!",`[,IL!2c`!!DPM2c`!!4mm!!&1Z3!!!Z"1Z3!!!Y"
+J!!5D$%-!)@B!"**96bmYq)#TB$!IX'f6N!"X!!5!,bhiJ$mYNj!!U@-r,C13!"m
+m!!&1Z3!!!Z"1Z3!!!Y"J!!4H)'m"&,(Yq)4Q%$m$,bm"-Nkj!!!#N!"J!!4%)'h
+iF#"35P"[!!#-98m[,`%b5'm"'%K[!6*1Z3!!!NJ3(fGb-'m"%L!)8i!L2!!!!4*
+1Z3!!"0SJEIK`)&""k!%3dF"$eh"$)YK4b2rm-YK&ee925'm"+L"Yq*JJ8%KS!!K
+)E`%bU+S3(fF!!pC96dK[!5T+DJ!1AX"%!"m!6VN!!!03%"pR!!1k2bm"%Nkkp3j
+J!!1Z5Lf0RfF!!kB[,ILBUGK+,BfMCd496bm[!6)[,IL8U1J3(fFd98p)E`%D,bh
+iP%kj!!!"+"!ICMi[,`%`F!!`,`%U!S!!!!)!5S"@`%3!(`![,ILBUG4J(Lm[!6"
+`!$![!5S#J!!!!J"+J&E!4!!I!#mYq*LTe%SYMD0R&&92,bhiP#mYq*Jr2!!2U$d
+`(cB!6VN!!!,BB!!$&%SYMCTR!!--)'m"0,(Yq-4Q!!-!4Hhi[&925'm"'NKU!!j
+)DJ!35'S!%Nkj!!!"k"!IC`!#hMmU!!ir+J!32bS!%Nkj!!!"U'!!!XKC6kNN)&q
+al`%dC`S[,`%dU4pJ!!+b)'m"0,(Yr1*Q!!$')'f0P#"35LJ!#@F!!,JlI!%Bq,B
+lI!#@q,4C6bm[!6J[,`%i5'hiY+NV)"mQ!%U$C`!#FLmYr1+SFb"Yr1*)D!!3U+0
+96bm$U'S`(cS!98m[!kKV-"mi!#mYr1)r"$m&(c`!!DNG)'hmiNKS!"#SHb"Yr1*
+)D!!3U5K1Z3!!!RK1Z3!!!S"1Z3!!!QK1Z3!!!Q"1Z3!!!PK+,BfPC`C1Z3!!!R"
++,BfMC`!"qP92,bhiP#mYq*Jr2!!2U$d`(cB!B!!"iNSYMCTR!!(D)'m"0,(Yq-4
+Q!!(1,fhiY!%S,fhiZ!%X)'hia(!"d'J!&Mp!!5SJEIM%F!(3D!!@2d!",Mpm!*B
+"+&P2,bm"1#m[!6K)E`%dU5XJ(bB!5S0R!!'',bhia+Kc)'hia%KS!"#SSe92,`1
+SDM!I1J"96bm$U'X`(cJ!,bhia$m%2`8I2!!"U4dJEIM%5'J!%+Kl)'hia%KS!"#
+T+%kj!!!"d#mYq,bTd%kj!!!"f%kj!!!"b#"Yq-!J8%KS!!LT+Nkj!!!"Z#mYq,b
+Tf'!!!3a+,BfDC`SJE`%dXHhia'F@)'m"0,(Yr1*Q'L"YMC3J8%SS!!KR$Lm[!63
+[,`%d5'hiV+NP,bm"0+NIB!!!cP92,bm"0Lm[!6DT(K!IC`!![#"[!65alIcLCJS
+EI!!"r1GJ!!#S5Lf0QQF!!+!JE`%dXHhia'B!!*3[,IM%U4B[,IL%U@eJ!!#%98m
+[,`%f,bm"0Mm$U$X3(fG`)'m"0,(Yr1*QCLmYr1+SFb"Yr1*)D!!3U+-[,IcL2`0
+C6kNN)&qalIcL9m"%!"m!U$SJEIcL5'J!%+Kl)'hmiNKS!"#T+%kj!!!#H%kj!!!
+#J%kj!!!#D%kj!!!#B%kj!!!#@%SYMD9R"Nkj!!!#F%r[!6K-h`3i,Tp1GC*%48&
+-9dP85%e2990&4%pA6P-!!!")ja!J6qrrl#"[!#"$l`!%)YJLf#,B)YJZV`!'GJ!
+@,`!$@8p`!$![!"B[!%Ki!3#S@#!I$)!!!!%!CK*C6cm$U6iJ(bm!6VVUL'!!!D*
+C6kNN)&qalIcLCJ!"8&92-%-[#%KYNE*)H!!J6VN!!!$3%"pR!!&k-!01Z3!!"J!
+"F!!"!"m!"`!"!"i!"!!b!!X!qJ!-!3B!(!")!"d!L!!H!-S!(`$@,bhiK%*RU@0
+1Z3!!!PK1Z3!!!Q"J!!%b,bhiK&92,bhiK+PL-"mr!+PM6VN!!!*B6VN!!!*JB!!
+"%!aY!!'6N!"[!!%'$'d!!C11E`!!r%SYMD9R$LmYq)!`,C118d!r!+PM-#f6MP0
+!2`!I2!!"6VN!!!,J6VN!!!,3B!!!c!aY!!'6N!"[!!$#-#f6MV"YNj!!E!!!YNS
+YMD9R$LmYq)"`!G"YNiir!+PMF!(3EC112`!I2!!"6VN!!!,J6VN!!!,3B!!!KLm
+Yq)3r2!!86VN!!!+)B(3[,IL%2c`!&8kj!!!#L'"N,bhiK$mm!"C1Z3!!!SKJ9#m
+Yq)3r2!!A6VN!!!+)B%4+,BfDCcjC6kNN)&qalIM%CM*&lILm98p)E`!'5'S!$NK
+U!"")DJ!56VN!!!(`%"pR%MmU!!ir+J!32bS!%Nkj!!!"U%r[!"4-h`3),Tp1GC!
+!4%9"6&G*9%K,49P%6eG18`!!!#m+6qrrl#"[!"j$l`!%)YJLf#,B)YK"l`!%,SJ
+J9b4S!!)[#UKc5Lm!('FJYHhmiQB'6VVRH'!b5Lf0QQFXYHhia'BQ6VN!!!(iB"k
+elIcLCJC1ZZIdB"*+,BfDC`belIM%CJC1Z3!!!J"1Z3!!!Y"2l`!8*&mJAea26Y#
+44%9"6&G*9%K"3e4*9N&849-!!#m+6qrrl#"[!"a$l`!%)YJLf#,B)YK"l`!%,SJ
+J9b4S!!+elIcLCJK1Z3!!!XKJ%NSYMCTR$,AYq-4Q"Nkj!!!##%r[!"3NAbkI6R@
+24%9"6&G*9%K98%4"9%96!*!&Klq&YiDhPSq)N!#+NBK!TYYrR['-NT&!C%"3QN(
+)3D9qYF9"Lhkfa%"-q-ViTSC#[hhjihqFM%)RI`*ql%+!ID9#L1RFII(MiN"'UIA
+e3B"rH(q+dXk9Y8&1I`+CP*j!8rAVpH*!CRqVSU"!Ed"*3%D'39rLbY$)3,rLdYr
+Tb%,QI`"qQ%",NV+MXCU-390r!%%$I`""!hm!330r!%%*I`"!C)D$L8$6Xqq8ld"
+6hDEG3%6iq2L`Ll@3!)1RLJ!!!!0$dN8r3P8!N!B1MJ"3!"3!!!"3!!!1GL*I)&q
+J*5k!DJ*#Pdl4)KmJ(b*I)&qJ,L*"6Y%LAa)I)&p`!"!B,`P+!@F%S&4J!U*86R9
+19[r1)%mKEJ!1!")aEJ!-!"C#+!!D3LJ!'d+S!"a`'U"J$%$rcQB#S!!LEJ!)-UJ
+!'$e!!"*1AL"I6qm!#Nl36PErcL"2-@i!#!!BS!%p3!!+6PiJAe526Y"4`@!#8-&
+19[r1)%mKEJ!)!#!aEJ!3!"JLEJ!-)9%!*%*S!#a#U!!Z5J&Q"+!#B!+J!ce!!")
+LEJ!-)UJ!+%jH)Pp2l`!+6Y&19[q`)%mKEJ!1!")aEJ!-!"C#+!!D3QJ!(+!-28!
+!%N(S!#!LEJ!)F"#J,NjH)Pp2l`!+6Y&19[r!)%mKEJ!+!")aEJ!)!"DJ&6e!!!j
+1AL*IA)p1d8j@rm!J6c&Z!!J!&L&Z!!S!%U!628!!$NjH)PpFMdl46PErX#"2)@i
+!%J!5-@i!%!!@3LJ!'U!)CKC#D!!FS!aQ$N2S!#!LlJ!))Ui!$+!028!!&NjH)Pp
+2l`!16Y&19[r1)%mKEJ!+!")aEJ!)!"C#+!!DS!Np3!!16PiLAeb26Y%JE`!%)#m
+!#%*RUHiJAe"26Y!JE`!%)&#Ti5*[!!3LL$p!!!JZRdje)"mLAbYI!"3L88(k!!S
+M5!!U)%"1d%)R)'d!&%k3!"!I6R919J!!@8m[2&088L-r,J!+UD!LEJ!-3K%J(fF
+L)%!J8$!B-Li!#'F@XN"L%R!!8d&R"K!BdF"JpK!38N#J,NjH)&p3Mdl3)'m!#!*
+3IrmJE`!%5P"X##"[!!J!8)!!6R@+6AP$Eh"j8fPREJ!!!%r[rrBZV`!5,fm!&J!
+%2fm!'J!)5&Fr2!!2UHXJE`!1)*FKE`!%!!3aE`!)!!K2l`!+6R@%CQ&LF`!!!%r
+[rr)[E`!@!!3[E`!D!!JrE`!H!!a)E`!#2c`!!kRV2Va!!%KA2c`!!DRV5'm!"$m
+m!"5TkdK[!!)r2!!"UHXJE`!5)+m!"#&[!!J!"$&[!!`!#%r[!!j1GB9QE'p[FJ!
+!6qrrpLk[!")[E`!@!!3rE`!D!!K)9cmm!"5Tkb"[!!iJPb&[!!3!"$&[!!J!#%r
+[!!T1GB4bD@jd!!!!6qrreN*[!#K)E`!S2c`!!DRV,bm!1#m[!$Jr,`!k5'm!+%k
+j!!!$%%K[!$Br2!!$UHX),`!%!$C2l`!1Cfi[,`!i,bm!1$m[!$T)E`!86VN!!!*
+b,h`rrS!!!!j#V`!53Qm!&NK[!"K)E`!52c`!!+RV,fm!$J!L,fm!%J!Q2fm!&J!
+U5'm!)NK[!%41Z3!!!NS[,`!`,bm!-$m[!$*)E`!q6VN!!!+Z6qm!*#"[!#iJV`!
+H)@m!)J!%-@m!*J!)6qm!+NjeKA*[G@jN!!![!dr[rqa#Pd+[!!4#E`!)5&G)E`!
+J2c`!#+RVE#JZV`!F,fm!)!!%2fm!*!!)5&Fr2!!@UHY)9dK[!!3r2#J3UHXQ&f"
+),bm!)Lm[!#)r,`!N5'm!&%kj!!!$6#p[!"J!$Lp[!"`!%Mp[!#!!&NK[!!ir2!!
+@UHY)E`!15'm!%Mmm+"#TkbB[!!j2l`!1)!02l`!8*Kp1GBKbEh9ZC(4[E!!!!%j
+@rf!`,J!)"%$lifF!!3"63'F!!*!!"%!%&fF!!Ua63'F!!Qa63'F!!Ia63'F!!Ba
+63'F!!4a93'F!!Y"C3'F!![aC3'F!!aKA3'F!!d4C3'F!!h"G3'F!!kaI3'F!!pK
+C3'F!!ra63'F!"&J%3!#SC`!'%J4!!'*R!!558d"R!!5m8d"R!!6S8d"R!!888d"
+R!!8i8d"R!!9d8d"R!!@ZB!!'#Lem)%PZG[pJ,AaKE'PNrf3YI#"`EfRrD#emER4
+PF[pX,A`JF'&crh!YI(0PC#$rG#emG'mJ8[pi,AaPE'9Krh`YI(0P)'rrJ#emFL"
+%DIq%,AacF'pcriJYI'8Z)#$rM"em!#rrB'!!"D3YI#"2GA6rB#em)'pQ)2pN,Aa
+YC@e[rfJYI(*j)'ErE#emBA4KE2p`,A`JCA*brh3YI'pb,L$rH"em!"[rB'!!"@)
+YI#")C@(rB#emF#"MD2pN,AaPBfXJrfJYI'CKD@crE#emC@3Z)2p`,Aa8D'8Jrh3
+YI&"KFf2rH#emB@`JD2pm,AaPBA!Jri!YI'Pc)'2rK#emEh*bGIq),Aa`G#iJri`
+GI!![rf"J!!6i,A`J4'9brf!YI'9QCA,rC#emC@jMCIpS,AaN)'%Jrf`YI%j*6#$
+rF#emF'pTE[pd,AadCA)ZrhJYI#"@B@crI#emD@4KG2q!,AaP)'CKri3YI'PXC@6
+rL#em,L!J)2q-(A`!,IpJB!!%MLem)%4PF[pJ,AaPCQ9brf3YI'9ZBfArD#emC#"
+K)2pX,AaLB@3Jrh!YI("[D@lrG#emG'9b,[pi,A`J9Q&Xrh`YI'PNBA6rJ#emC5"
+QBIq%,AaTE'9NriJYI#iJ)#$rM"em!#hrB'!!"#3YI#"6CA6rB#em)'p`CIpN,Aa
+bBA4TrfJYI'pZ)'ErE#emB@PXCIp`,AaN,L!Jrh3GI!!9rf"J!!2U,A`J8h4brf!
+YI'PZCb$rC#emBfpYF2pS,AaKFQPcrf`YI'pZ)'ErF#emB@PXCIpd,AaN,L!JrhJ
+GI!!Crf"J!!1S,A`J8'9brf!YI'eTFh2rC#emD@pZ)2pS,AaNC@jTrf`YI'9N,L$
+rF"em!",rB'!!!hBYI#"*,drrB#em)'9bF[pN,A`!Eh)ZrfJGI!!+rf"J!!08,A`
+J3Q&Nrf!YI#"QD@crC#emC5"ZGIpS,AaYBQ9brf`YI#iJ)#$rF"em!"$rB'!!!b)
+YI#"1Eh6rB#em)'9ZErpN,AaeCfJJrfJYI'ePE@rrE#emFRNZ)2p`(A`!%[pJB!!
+#m#em)%4PG[pJ,AaTBf8Jrf3YI'pb)(,rD#emCA0[GIpX,AabBf8Jrh!YI'*eFhR
+rG#em,L!J)2pi(A`!'2pJB!!#VLem)%PZG[pJ,AaKE'PNrf3YI#"KFQIrD#emG@e
+PE[pX,Aad,L!Jrh!GI!!4rf"J!!*m,A`J5@aXrf!YI'9RB@crC#em)(0PCIpS,Aa
+V,L!Jrf`GI!!0rf"J!!*5,A`J6@&drf!YI'JJBA,rC#emCh9YCIpS,AaZG#"[rf`
+YI(9d)'rrF#emCL"NErpd,AaYB@PZrhJYI#"[CL$rI#emCR9ZBrq!,AadD@pZri3
+YI#iJ)#$rL"em!#MrB'!!!I!YI#"0BA6rB#emD#"bCIpN,AacG@adrfJYI#"ZEh6
+rE#em)(*PF2p`,AabCA0Prh3YI'jdB@,rH#emE'8Z)2pm(A`!([pJB!!"TLem)%4
+TFrpJ,AaV)(*Prf3YI'&N)'ArD#emFR*[F[pXF#iY32p`(A`!%2pJB!!"GLem)%4
+TFrpJ,AaV)(Gbrf3YI'PdC5$rD#emCA*bErpX,Aab,L!Jrh!GI!!4rf"J!!&%,A`
+J4QPXrf!YI'8JEQrrC#emG#"KFrpS,AacD@GZrf`YI'9N,L$rF"em!",rB'!!!4)
+YI#"'D@crB#emC5"ZErpN,Aad)'p`rfJYI'9Z,L$rE"em!!lrB'!!!1JYI#"'D@c
+rB#emC5"ZErpN,Aad)'p`rfJYI'9Z)'ErE#emEh)JDIp`,AaZF(9drh3YI#iJ)#$
+rH"em!"MrB'!!!+BYI#"'D@crB#emC5"ZErpN,Aad)'p`rfJYI'9Z)'ErE#emEh)
+JErp`,AaeG("erh3YI(3Z)#$rH"em!"RrB'"N,A`J5@jfrf!YI'&XD@6rC#em)'j
+eEIpS,AaPFQPMrf`YI#"QEh,rF#emE@&d,[pd(A`!&rpJB#`YI#"'D@crB#emC5"
+ZErpN,Aad)'C[rfJYI(9ZC#lrE"em!!rrB'!%UIpJ"NKZrf#VrdjH6R@28f&QC84
+PBR9R8h4bD@jR!!"19J!!)Li!#%U"E!BJ!85!B!)J!5p!!!a1ALkI6R@+Aep59%a
+"3P0IA`!!!%j@!!!["#m$*Li!%#J$jS4+Jfd+)#i!#1H)YS"Y"N)[!"aJ*L!Z!!K
+6J*!!K#"Z!!`3-!J!5)"b"m+$G!(MDX4!5N*@`N3#(d)!(#BI+"p1AL"I6qm!$%l
+3LPpI8d98AdP1Aem!!!"19J!!51FI-#CZ!!iNEJ!+2Li!#(J!'"Yk!"SD5NGQ$,K
+&C`K#,`!ZB!!!k!a(!!&Q$VK&C`SII!!"!#jJ!!$8Z%9["$`&B!)m"$B'B!C5Le+
++8d0+3fm'%"1`%QI`-!F-3!!&BJ!!R0"!-$X!"Nll!!)!$!!F!#J!3J"F!(C+3fB
+!!)`II!!"!#jJ!!#'5N0RI"pm!!%!,Q"i5N0Q",K&E3T+3fGS%"1`%Q4L(h`!!3!
+ZB&j+3fB%Z%9[#NT$Cdi3%l!5C%JII!!"!#jJ4%T$CJ5i4@i+5N0R0"!6X"*M,Kp
+m!!%!,Q!U5N0Q",K&E!T+3fFD%"1`%Q-8(h`!!3!ZB"!r22rl6VN!!!5q9%p#,`!
+Z60m-q%jH)&p2l`!+6Y#-Aep59%008&088PpI!!!!6PB!!%MR($Kf!%RZ!!K8M&L
+-*'crr!aZ!!%!#'`%3K*JBRB!B&CBM#CXrr`J5e+)+!J`!e*!)%V3`#S)F!!3%p"
+$$%!!rfmD,`3["6!m!2q3!%0)`#m!6VN!!!!D0M`!rf!J,`3["A!!%"-[!%kj!!!
+!'R!!%"2@3&0Z!!K+EJ!)CU38JdcI($K1ANjeLPpI3dp13d&8Aem!!!"19J!!51F
+I1#iZ!"!k,J!11#i!$#4Z!!JJ4hB!&K"R'NT%EaC+4@m5ZN0Z$VK$EJS`"G"%8d#
+`3fm%3K*J1$!&8d!m!ja![%4X!MJ'&)3Q4pE&+%T5M$"%)!JL6#",FL#`J@8%SLj
+J$NU!C`SL#4,B8i"QqL*"60mFq%jH)&p2l`!-6Y#)Aep$6e"CAem!N!i)3EL@RiY
+!384C3%[e!!!DVJ!S!!8!!!!S!!!D6&P2@8mZZ!%`)&mJ#!5!!!!R%#k!,aFJAk!
+Y@%p1GBT649498&08380,!!!!51F!1%r[rmJQI!!!!K3SI!!!!jK&l`!%3US!$%+
+U!")`%d4!08!!&L98!$"96dK[!!BJAh!"SQ!qJ$!I2S!rDJ!@!!)rE`!#!%K2l`!
+i60mF!%jeN8G&9%098P*&6P4@8N9'6P90!!![!e92UC3`(cY!NIK96dkkriJ`(cY
+!NIC#,C!!XPP25(K#f#!IS5)ZL#"I+dMiF&P2S@BZL#"I)QhiF#*4)dJ!"PP2S@B
+ZL#"I)QhiF#*4)dJ!#RB"B#"C6k&Q,SJJAc*$)!P6J1@))QhiF#*43qN!)#1)#!"
+53`a$!$a[fLBI6R@,8d9899"048e28PN!!#"[!!J`V`!')'m!#$&[!!3!!L"I8%p
+1d)C6494%58d!!!")ja`J6qrrm$!Yq+U3!'hiTMp!!!)`,ILSN!"Yq+3qJ$p[!#J
+!$Mp[!#S!$(BU-#m!!Pe!X'm!$Ph!4!!D!$!A"%!!'h)5dQm!$,*!AX&%!4J"4GG
++"@F85'm!"$mm!!-`+J!#9d!r!%kkrhC+"'F35'm!#$m$-"*A3$m!6VVrBM![!#`
+-3!!*BJ!$H0"!-$X!"Nll!!)$E!!8!%J!ZJ$d!@!##J*m!VJ$-%S&CK4)E`!%2c`
+!!h!$d'm!&$m!6VVr)%S%CJ!$2%K[!!Jr!c!$d'm!%Mm!6VVr#'!!!bC+"@B85'm
+!"$mm!!0`!p"[!"3r!%kkrZa+"'B!!`K)E`!)-")%3!!EN!"[!"")`#)!i)RJLH#
+*lSR5J1+"-%25L$m"-!0@3$)5NN#5E`!55-%J!H#)i)MJL1k)d)(LJ$)$dQm!%NM
+"dS!r!8kkrTCJ!!+d5J9Q&%K[!!3r2!!$F!23E`!82`"1Z[jk5J4Q!!+@5'm!#$!
+59d#3!'m!%$m!-"*A3$m!6VVqA'!!!RT+"@C-5'm!"$!U!!*G3*!!E`!55-!L!1#
+*i)RJLHk*dS$LJ9D"2`%`+J!#A8#3!'m!&%M!)J$JLH#*i)RZLG+!iS&`!p"[!"4
+)`0#"2`"1Z[i)5J4Q!!)N5'm!#$m$-!23E`!52`"1Z[h`B!!#$NS&CNa)E`!%-#S
+!!Pe!N!"[!"*)`#)!i)RJLH#*lSR5J1+"9S%r!6!U!!*G3*!!E`!85-!L!1#*i)R
+JLHk*dS$LJA!$d'm!&%M!d)%r!%kkrCa+"'B!!EK)E`!)-")%3!!EN!"[!"")`#)
+!i)RJLH#*lSR5J1+"-%25L$m"-!0@3$)5NN#5E`!55-%J!H#)i)MJL1k)d)(LJ$)
+$dQm!%NM"dS!r!8kkr8CJ!!&N5J9Q6%K[!!3`+J!#A8#3!'m!%NM!)J$JLH#*i)R
+ZLG+!iS&@J6m"-#S!!Pe!N!"[!"4)`#)!i)RJLH#*lSR5J1+"F!23E`!85-$3J6m
+!6VVmmNS%CJ!"$NK[!!J`%PG!N!"[!"!r!$!59d!r!%kkr04J!!$b5J9Q(%K[!!3
+`+J!#9d#3!'m!%Mm!-#S!!PG!2`"1Z[b`5J4Q!!$-5'm!#$m$-!23E`!52`"1Z[b
+BB!!!YNS&CKa)E`!%-#S!!PG!N!"[!")r!$!U!!*A3$m!6VVmG%S%CJ!!N!")E`!
+)-")%3!!EN!"[!"")`#)!i)RJLH#*lSR5J1+"-%25L$m"-!0@3$)5NN#5E`!55-%
+J!H#)i)MJL1k)d)(LJ$)$dQm!%NM"dS!r!8kkr"jJ2%S&CKa)E`!%-#S!!PG!N!"
+[!")r!$!U!!*A3$m!6VVlr%S%CKK)E`!)-"*A3*!!E`!32`!`%PG!2`"1Z[[J,bm
+!*$m[!!Jr,`!12bm!$Mm[!"5STdr[!""-h`3i)&p2l`!+6Y#,8d0"6%9A58j%6eF
+!!&e298m[,`!-5'm!"L*I)"qKV5+)2S!`(fB)2fm!!J!%B!4#E`!%2fm!"!!1A%m
+ZRdjeN!"(494(490838a88N9698a8!!!!51F3)%r[rr4C6bmYr4Sr2!2SU"mJAb4
+),`SJAk!T,e)!"&925'm!"Nkj!!!$b$!I0J"`2-($0J![#L"IS#S[#UQM5Lm!''F
+Z98mr,C(i,bhp(Mmm!qK)EIdL3LG1Z3!!"!J3(fF32c`$k"mm!!&#*dkj!!!"H&9
+22bf4q#mYr53r2!2S5'hp+%)R6VN!!!3)%"pR6&P22c`$k%Ki!!")H2rrUA`JAbp
+)!!K)E`!),c`!-J!%(c`!!8kj!!!$%#m[!!LSFbm[!!LTJ6"$,`K)E`!%)PmJAk!
+l)S![,`!)UB02l`!-60m%##"I9%p1d)Y%6e4)49036%&65!!!98mJE`!'2UMq`$3
+AB#S`!P0!5-"6J1@))'m!"N(Srm3b3L)*8i(PL5*[!!C$kIr%)l!)!"J!8d)-3J!
+#E0!JE`!')@m!#[r%9%mJAe"26Y#,B@4N6@9Z5A4PE6!!!%MR($"2lrbX@8mr2!!
+%UENJAbY)q(`JEIKm,a#S86mYNILTQ$pm!!%#+Q!898mr22rr5'm!'+Pa%"m@!&*
+[!LS-E`!$!LT[j%)YMDY96bmYr5T)E`!1)PmJ(k'Y)SJqJ$!IC`Jr2!!"UFLTp%*
+[!LS`,`)UC`C63'F)B!a#,BfQB!BEI!!"MDC&lBfJ98m[,IdZ6VVpc$!I08!!#&9
+2,bhp-NkkrE``(dT!9X"%!"9!!!*96bmYr6C1Z[fQ-"p+3&E!4!!93!!"98m[,Id
+k6VVpN!!`(dM!,d!!#&925'm!#NKi!"qSA4!I&)"96bmYr6j1Z[eZ-"p)`#p!!!K
+96dK[!!T)H!!IU&d3(a9!!!0#,BfN5Lf0S'Fd98mr,C(i,bhp3Mmm!)&)EC!!XN)
+R6VN!!!3)%"pR&PP22c`!JDSE)&mV52Kd'h`!!BfNB$*96cmYNIJ[,Ie'2c`!J8K
+YN!#b3LG1Z3!!"!J3(fF8@8mr2!#"UENJAbY)q(JEI!!"MD496cmYNIJ[,Ie+3QG
+)EIe1(c`!!8kj!!!%#"!I'J"+"@F'6VN!!!&)1fhpA*(d1fhpAT(b+ff-$[LN+ff
+-%[LS3Qf4qP92,bhpB+J0-"ml3*13!!aY!!'6N!"X!URd@8m[,IeN2c`!J+JI)&m
+N5#m+)&qJ+8IYMCK96bm53UHSA4!I&S"96bm55(J!!DKG%"mA3!!"98m[%NKi!!+
+SA4!I&d!!!P92,a*)H!!$U&d3(aG!!!096bm55(J!"+KG%"mA3!!%98m[%NKi!!@
+SA4!I&d!!"992,a*)H!!'U&d3(aG!!!C96bm55(J!"kKG%"mA3!!(,`SJAk!U,`U
+TSdIYMCK+%fF!!4*C6bmYr@Jr2!#!U"mJAbp)!#3[,`!N)&qJ+8AYNj)JE`!N)&!
+dN!!JE`!N)&!eD!!#!!)JE`!N)&!eD!!%!!3JE`!N)&!eD!!'!!BJE`!N)&!eD!!
+)!!JJE`!N)&!eD!!+!!SJE`!N)&!9D!!-!!`JE`!N)&!9D!!1!!iJE`!N)&!9D!!
+3!"!JE`!N)&!eD!!5!")JE`!N)&!eD!!8!"3`%Y"U!!,3DJ!%d'S!"Y"U!!M3DJ!
++5N"@`%3!&S![,`!N)&qJ+Lm[!#5TSdS6Cd*C6cmm!qLTZL"I*%JJ#QBN5'm"+#m
+m!!`!J%kj!!!$U%([!5aB6d2YME)J2!!!!3#L,Q!1)&*$lBfb)$`!!!%!SLj(lBf
+B5LX!!@GD@8mr2!ZhUESJAb4))&*$l`)X)$`!!!%!SLj96dK[!5T)E`)b6VN!!!-
+!@%p)E`%U5'hpE$mm!!&1Z3!!!0J3(aG!!!&++`!"Ca![,Icm2c`!!8K[!M+T4kN
+h1h`!!C11$'d!!C13!'mF@8mr2!!b5'hpGUNa)&mV52ci,bhmq$mmrrqT08K[!5J
+[2!!3!)"1Z3!!!kK"l`%X@%p$l`)X)$`!!!%!SLii,C13!(B"B!!!MJa$!'4[!UR
+d@8m`!`C!"p&63$m!UESJAb4))!TQ6$"$)!K6J1')3Hf8F0(!5&")E`%X2`01Z3!
+!![KB6dK[!5a)EIek5'm#1%K[!$Jr2!!$6VN!!!$J3Hm!2Nr[!")LAb!m!!!"!+)
+ZB"S`3b!)8i$KL%(YP($4`%23)&)J2!!!!3#L,Ja$IrpR#&*$YN4[!2p`5Lf0QQF
+!!6KC6bmYrA`r2!#!U"mJAb4),`SJAk!T,e)!"&925'm!"Nkj!!!$b$!I1d$meP9
+25'm!"Nkj!!!$b$!I1d$mf&925'm!"Nkj!!!$b$!I1d$mfLm+)&qJ+Lm+UD0&lIL
+m@8m[,If!2c`!J+JI)&mP5!!8,bS!&+Q5)'S!&#"309!!$&P22c`!!NKi!!")H2r
+rUEdJAb9)!!K)DJ!),c`!!J!"3LG1Z3!!!a![+J!)U(-[+J!)5'm",#mm!"!!J8k
+j!!!$U&K25'm",+ND*NT(k`3D98mr%cmV!!+T!K!ICJir2!!"U)Fr2!!*U)TJ$$m
+U""USKcmU""bSLL9mrrrm'!3@@8mJDJ!)5'J!%#"U!!K)D!!3U$iJAb5)@8mr2!%
+#,bS!#+Qq)&mP5!!%3LF[%UJ66VN!!!(J5'f1XNK[!Lj)E`!)UI9C6bmYrB3r2!#
+!U"mJAbY)MC3JEBf8)&"++!!*Ca3JEBf8)&"++!!)C`JrI!!)!LTJ"%*[!LT)E`!
+-,c`!-J!b,c`")J(JU+G+,BfJCcjC6dKi!!")E`!85'hpL%)R2bm#2%KirrmI2!!
+"3UHU45"I+dMmiMmYNij1Z3!!!X![,IcLU(0)EIcFUK9J*PP25(J!!%K[!"4)EIf
++3LFr,`)m5(Mrramm!!&#TkN6)&mV52cL6VN!!!+i,bhmiUKc4HhiT#mYMC3JAk!
+T)'f0P#"3-""63'F+8d"R!!#FB!!!kL"YMC3J8$!S!!*R#P0!CaC63'G%B&!`+J!
+'N!"U!!*G3$p!!LTJ3$!U!!D3!'S!!Ja!!J"[&$!U!!D3!'S!!Pe!"%!!8$p!!LT
+J(M!U!!D3!'S!!Pe!2d!#+Q!1-$`#!0"U!!*G3$p!!LS[,IcL,c`!+J!$3LHT'bm
+Yr1)r,`)Z-#S!"*!!8J4!!"3%3!!2Ad"A3$m!3LHT(@"5)'f0P#"32bJ!!L"YMC3
+J8$mS!!3JEBf8)&!r+!!'5'm!%NkkmQC&l`!-,bhmiMmU!!)r%N)RU4X[,IcL-#S
+!"T!!DJ!#2`!`+J!%N!"52`"#*kNG,bf0P#"IS#S[,IcLU(0C6b"Yr1*)D!!3)'h
+miNKS!"#S2L"I+dMiQ%SYMD0R#PP2U0JJAbY)q*4#*bmYq*LS%dKj!!!#S#mYq*K
+1Z3!!!,![,ILB)&qJ+5"Yr1)LEILB)P%LU!!3)fJ!&!!%,bhiQ#"IS#T1Z3!!!RK
+C6cmm!3![,IcLUEiJAbY)q)41Z3!!!QJ[,IL%2c`!rkPG3LhmjPP25(J!H#!IS5)
+ZL#"I+dL0VN)Yr1G"lIf-3qf4dR!()YK4b2rm3HhpV%2YNE*`"b,B8FMrr"Ym!!'
+0V%AYq+4)EILXF!63DJ!#2`"`'0"52`!`+J!'@8!r!$!U!!4C3$m!U+G)EILd2bS
+!!R!Bd&)r!$mU!!Br+J!%U+G#E`)U-#m#+QF'8d"R#'!-3Lf0V@!''h`!!BfY5Lf
+0QQB+$'d!!C13!'m!!+`lI!!$r1KC6cmm!!5T[b"I+dMp##mYr3K#CkNe5'm"+#m
+m!"!!J8kj!!!$U%([!5aB6d2[!L`J2!!!!3#L,LmYr3K#CdK[!M+T4`aY!!'6N!"
+["Nkj!!!"N!"+,BfDCK`[,Id)2c`!!DP5,bhp#$mm!!'T8MYm!!(mk'!`5'm"+#m
+m!"%!J8kj!!!$U%([!5aB6d2[!L`J2!!!!3#L,LmYr3Jr2!!"5'm#-UP(3Qm#+%K
+[!5J[2!!*!)&1Z3!!!kK"l`%X@%p$l`)X)$`!!!%!SLi[,Id!5'm#-%*RU#C`!G"
+[!LJr3!)S,bhpc%K[!fa1Z[9f4Hf0Q%SU!!CR4%K[!5J[2!!)!)&1Z3!!!kK"l`%
+X@%p$l`)X)$`!!!%!SLi[,Id!5'm#-%*RU#C`!G"[!LJr3!)S,bhpd%K[!fa1Z[8
+S4Hf0Q%SU!!0Q$%SU!!4Q"NSU!!9R,Kpm!#d#,Mpm!LJ#,#mYr3")E`)`3QHS*R!
+"d'm#+$p!!LJ[,Ih85'm$E%kkp14(lBfB4Hf-M%SV!!0R!!$F5'm"+#mm!!F!J8k
+j!!!$U%([!5aB6d2[!L`J2!!!!3#L,LmYr3")E`)`3QHS*R!"d'm#+$p!!LJ[,Ih
+B5'm$E%kkp*!!5'm!+#mm!!B!J8kj!!!$U%([!#aB6d2[!L`J2!!!!3#L,LmYr3"
+)E`)`3QHS*R!"d'm#+$p!!LJ[,IhF5'm$E%kkp%a++`!%CJC++`!&CbiII!!Y!Li
+rI!)S!L`[,Id!5'm#-%*RU#C`!G"[!LJr3!)S,bhpi%K[!fa1Z[353Hf3!,)L5L!
+m!!!"!+)Z3LS"!"9m!!%"!8AYMCK++J!&Cd4)E`%S,c`!"3#"6VN!!!1S3Hm",&K
+23qm#,#!m!!!"!+)Z,bhp!%K[!M"#CkJQF!(3E`)S2d!#+#mYrH4)E`0X6VVcV%A
+YMCK++J!%C`!!LNK[!5J[2!!%!)&1Z3!!!kK"l`%X@%p$l`)X)$`!!!%!SLi[,Id
+!5'm#-%*RU#C`!G"[!LJr3!)S,bhpk%K[!fa1Z[0F5'm!+#mm!!-!J8kj!!!$U%(
+[!#aB6d2[!L`J2!!!!3#L,LmYr3")E`)`3QHS*R!"d'm#+$p!!LJ[,IhX5'm$E%k
+kmaLT0dAYr1T#8N*U!!*#DJ!%3QS!"N*U!!K#DJ!+3QS!$%AYr1Si,`)SGJ&J!!$
+1-%-J#&1!jBK"l`-X$,"338G&#!"Q"M5$B!!!UM"$)!K6J1@)3Hm$,!b`8&*19!J
+!CJJe3`!#B!!!M$"$)!K6J1@)3Hm$,!b`6e988!J!CJBe3`!%B'i`3b!)8i$PL%(
+[!b`-X%C14%F)!'B'08-!#'"5-%-J#&1!jBK"l`-X$,"'58j%#!"Q"M9$!!CJ0M"
+$)!K6J1@)3Hm$,!b`9&*"6JJ!CJBe3`!+B"S`3b!)8i$PL%([!b`-X&&9593)!'B
+%08-!$!a$IrpR#&*$YN4[!2m`6VN!!!,398mr,C(i,bhpm%*R5'hpp"mm!!&1Z3!
+!"!J3(aY!MD9+,BfPC`!!M!aY!!'6N!"[!!##@8mr2!2S,bhmiUQq)&mV52L!)'h
+iJ#"3)'J!(#"3%@f0S!"&)'hiJ#"3)'J!(#"3%@f0QJ"%)'hiJ#"3)'J!(#"3)@h
+mq!!m3Hf8F#*Yq)!L85*T!"`L850)!%![,IL!2c`!!DPN,bhiJ$mYNj!!U@8[,IL
+!2bf6MUPM6VN!!!*`98mr,C(i,bhpqMmm!qK)EIhq3LG1Z3!!"!J3(fF'(`91Z["
+!,bhmiUN9,bhmiUKc,bhmiUNI)'hmiNKS!"#SSbmYq)5TE6mYNij#*dkj!!!#i#"
+Yr1*)D!!3U5T+,BfPC`i-E3!"Nj!!E`B[,IL!U@fS8%r[!e4-h``i6R@+8d9899"
+69&9'4J!!!%MR(c"2lr[L@8m[,Ii!2c`!J+JI)&mQ5#!,C`!#@#m,UC)[#b"IS#P
+C6d+R)"qK)Lk))&mN5(i!,e-!'#"[!"Jf%%K[!"K)H!!#6VN!!!1`2d-!&$pm!!%
+!&Q!!!A!JE`!B'"")K(B"eN4)`bm[!"K)E`-L,`-J(b*I)&qJ,NK[!"J[!dkj!!!
+$X%K[!"K)H!!"6VN!!!1`)'m!'"J35)4f!GC%5--[,`!B5'm!)#m$)"mLAb"IS#j
+)E`!B,`01Z3!!!l")E`-H5'm")+N!HJ"+E`%FCLj96dK[!5")E`-N6VN!!!-!@%p
+)E`%J5'hq"$mm!!&1Z3!!!0J3(fF'2hcrr`%FI!!F,`!FGJ&JB%([!"ai!"J`-!"
+96cm[!4ir"+N#%"pQ3(i"HJ&)E`%H2`41Z3!!![KB6dK[!4j)EIi-5'm$*NK[!LS
+r2!!$6VN!!!$J3Hm#-%r[!"*$l`-H)$`!!!%!SLi-3hrrC`C53lC'Eja+"@G+5'h
+q$NK[!b*)E`%Q2c`!!Nkj!!!!i%([!5a2l`!13qm$(L!m!!!"!+)ZGJ!@,`-H5-0
+96dK[!b%[#Lm$)"mLAb"IUHmqJ$!I1!!-Ehrr!"CR%&*[!"B`,`!@X'm!&'m!rSJ
+[#b"IS#S[#b"IS#0+"fF!!)DS8&P22c`!JNKi!!")H2rrUA`JAbp)!"")9bm[!"3
+r2!!#6VN!!!-S,fm!"!!-,fm!#!!35'm!&#mm!$`!""mm!!&1Z3!!!a![,`!8U(-
+[,`!8UB%[#Nkj!!!!8#!I*J!r2!!"U)Fr2!!*U)S[%Lm$5'm!%%*RUFj1Z3!!!aJ
+[,`!3UB-[#L"IS#02l`3H60m-q%jeMd4*8e"-39P'6dj86Np843!!,`02lri!GJ&
+J,PP22`1T[b"I-N-J#91!jBK$lIcm)iJ)!$"$)!K6J1@)3Hhmr#m`#!"#CkNe8N-
+-3`!$Em`[,Icm,bhq%+P05&F[2!!"!)&1Z3!!!kK"l`!%@%p$l`%!)$`!!!%!SLi
+[,Icm2c`!!8K[!3DT4dKA,c`!!J#"6VN!!!1S3Hm!"&K23qm"!#!m!!!"!+)Z,bh
+p!%*R5'm""UP(5&F[2!!+!)&1Z3!!!kK"l`!%@%p$l`%!)$`!!!%!SLi[,Id%3QG
+)E`%'U8G)9bmm!!X!J8kj!!!$U%([!!4B6d2[!3!J2!!!!3#L,LmYr33r2!!"5'm
+""UP(5&F[2!!-!)&1Z3!!!kK"l`!%@%p$l`%!)$`!!!%!SLi[,Id%2c`!!dK[!3D
+T4dKA,c`!$3#"6VN!!!1S3Hm!"&K23qm"!#!m!!!"!+)Z,bhp"$mm!!4)E`%'U8G
+)9bmm!!i!J8kj!!!$U%([!!4B6d2[!3!J2!!!!3#L,LmYr33r2!!&5'm""UP(5&F
+[2!!2!)&1Z3!!!kK"l`!%@%p$l`%!)$`!!!%!SLi[,Id%2c`!"NK[!3DT4kNh6qm
+#!#BI6R@*68&,48e&6P96!*!&2d,kXHQ+T%GpIkGjpZIQZN9ChYKrX0jrY0RQdAi
+KId4rS+Z+3&D13%Ihpd""3%G!4Te!Ui@9M%#(3Ip!@DP!IZVjid",LTkVid"JN!#
++N8$HkC!%kZVT!*!,'!!!"6!!!(4`!!!!#!!!!#!!!$mm!!'Tm!!!!!TB`!!3!!!
+!$8J!N!3"Q3!!!"B!!`!%!!8!"3!(!!J!!!%!!!!(e`!*!!!!$`j'EfpdCA)J5@j
+QEbiZ,J!!!!S!!J!#%iJ#!!%"!!!!'!#3"`)!!2q3"J!"rj!'!!!!*J!$"d0[GA*
+TCA)!!3`'4f9ZCACK!!%-#8KPE(CPG'PMB3!$$!iB!!!!DP9Z)("PG'Pd)(4PFh3
+0BQpXC'PdB@aTBh9ZC'9bE'PZC@peG'aTEQ9cD'&NEhF0BQaeC5"RFQ9PEL"hD'P
+dC5!0-6)J-63J-M30D'9XGQ9dD@0K)#KNC@BT)'0[GA*TCA)JCf9ZCACK$3d!!!&
+#!"!!N!81!!S!&3!!!!`!N!N1!!i!#J!9!3!!$!#3#4)!$J!+!"8#!!!-!*!*'!!
+1!!S!&33!!!`!N!NK!"!!#`!9#!!!$!#3#5J!%3!,!"83!!!-!*!*,J!1!!S!&3!
+!!!`!N!N[!!i!#J!9!!!!$!!!!!6rrJ!!!$3!$J!+!"8!!!!-!!$-c#,4!!!!1J!
+1!!S!&3!!!!crN!B!!!"!!!i!#J!9!!!!$!#3#83!$`!,!"8!!!!1!*!*4`!C!"3
+!&3!!!"J!N!P*!!i!#J!9!!!!$!#3#9S!$!!+!"B!!!!-!*!*BJ!3!!`!!`!!!!`
+!N!N+#80SBA"dCA)J-3!!!"3!!!!N!!3!*!!f!$B!"!!f!+J!N!8CB5"ZCAFJBfK
+KF(4PFL!SBfKKF(4PFL!b+3!!!"B!!3#3"3i!#J!9!!!!$!#3#3S*3fKKF(4PFL!
+b!!!!&!!!!#3!"!!N!$B!0J!%!$B!U!#3"!%!!!%E9J!"'PB!!!C[!%-La"H#!!!
+!(!9b!#4$4%9'!!!"+RCPFR-!!3%f8e45)`!"!8j35808!!!"CQecG()!!3&b689
+193!$!BTTBh-i!!!"ZQPMFc3!!!('D@0c)`!!!G**3dp1!!3"hNP$6L-!!!)DD@0
+X1!!!!LCTBf`d!!!#-NC548B!!!)q4%a24`!%!NT%594-!!8#KN019%`!!3,13Nj
+%6!!!!ZC"6&*8!!!#mQ0[ER!!%3,qB@9dC3!!!pCNBh4L!!!$iQPMG')!!!2Z4'Y
+!8!!!!rT%6%GB!!!%"N024%8!#J354%&833!!"*C659T&!!!%SRKdFM)!!!5ZCQp
+[G!!!",T69&)J!!)%aR08Gd3!!!6UBfaeG!!!"2Cb884'!!!&!P4&@&3!!381Fh4
+jE!!""5CAEQ4[!!%&2J!H!*!,!Irr)!!@p`#3"3,rr`!!&c!!N!@"!!8!!"GH!*!
+&J!!5!!!B!*!'J2rr!!!C[`#3"@3!(`!!'qd!N!9P!#N!!"[f!*!&!3!c"!!Er`#
+3"3-!0`3!(#i!N!8#!$`%!"ak!*!&"!"""!!FNJ#3"B$rr`!!(-N!N!@!rrm!!"h
+0!*!&J2rr!!!H83#3"!Zjrrm!!"k9!*!'rrmJ!"mC!*!&![rr)!!IR3#3"3(rrb!
+!)#%!N!@!rrm!!##P!*!&J2rr!!!K+3#3"B$rr`!!)Ld!N!@!rrm!!#Ba!*!&J2r
+r!!!S03#3"FJ!4L!!+%!!N!@%!%XJ!#KD!*!&JJ"3)!!SG!#3"!%b!&8J!#L1!*!
+%#lJ!@L!!++X!N!A)!'!J!#X2!*!&K!"P)!!VA`#3"B)!DL!!,"8!N!3"-J"[)!!
+Xe`#3"B%!G#!!,9d!N!3,Z!"j)!!YL3#3"!%!!(m%!#rT!*!%!qJ!K!3!-!8!N!@
+!rrm!!$!K!*!&J3#*)!!`33#3""1*rrm!!$"4!*!%%iVrr`!!-EN!N!36Lrrr!!!
+c0`#3""1-rrm!!$5K!*!%%ihrr`!!0J-!N!36M[rr!!!hK3#3""12rrm!!$M[!*!
+%%j!!rrm!!$R(!*!%%j(rr`!!1Td!N!36N[rr!!!lN`#3""1lrrm!!$b*!*!%%lc
+rr`!!2Hm!N!36[Irr!!!rD3#3""1qrrm!!%$*!*!%%lrrr`!!3LN!N!36L2rr!!"
+$U3#3""16rrm!!&,p!*!%%m$rr`!!9)d!N!Err`!!9Kd!N!3,Z2rr!!"DV`#3"!Z
+irrm!!&VM!*!(MJ!!@[X!N!3,Z2rr!!"E)J#3"3%!R4`!@l3!N!8#!+)X!(HD!*!
+&!`#X,!#-`!#3"33!Z#!!X!3!N!8(!--X!-Id!*!&#!$0)!$*D!#3"3`!dL!!dIB
+!N!80!0FX!03-!*!&$`$H+!$Z+`#3"4!!l#J!r,d!N!ErrbJ"&fm!N!ErrbJ!FQ`
+!N!6rN!3!!4H,!*!&J2rr!!%AQ3#3"B$rr`!"&ji!N!3$k!$c!!%AZ!#3"!I4rrm
+!!4R6!*!%"p,rr`!"'M!!N!@!rrm!!4I,!*!&J2rr!!%Af3#3"B!!q!!"&r8!N!@
+!rrm!!4JI!*!&JIrr!!%Cq3#3"B$rr`!"')d!N!@"rrm!!4S@!*!&J2rr!!%Ci3#
+3"B(rr`!"'Mi!N!3%BfKKF!a0C@je)&0dFQPZCh--6@PcBb"6G(*TEQGc#9&eDA3
+J6@9ZG3P4G@Pd)%PdC@d$BA"X"%9NDA3%4QPXC34MER4X"("bG$%%F(*d-J4QEfj
+d"'CTEQ3&B@*%E'F%F(*d-34`FR3b"'C[ER3%CQPZC!4KE(*d"@&L4'aR"(0dC(B
+%BfKKF!4KE(*d$NphEQ9b)(*PFfpeFQ0P"%eKD@i*9@jTGP"bEf0c#eGTEQ4[Ge0
+dG@CQ#P"bD@jd8h4eCQB*4QPXC90dG@CQ"%CTEQ3%4(*KC`C&GQ9ZG(-06@&M)%a
+TBR*KFQPPF`C9EQa[B@3%CR4iG!4'6dj8K3S!:
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/FullWrite_1.0 b/writerperfect/qa/unit/data/writer/libmwaw/pass/FullWrite_1.0
new file mode 100644
index 000000000..841bf98b4
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/FullWrite_1.0
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/FullWrite_2.0 b/writerperfect/qa/unit/data/writer/libmwaw/pass/FullWrite_2.0
new file mode 100644
index 000000000..456b55d6a
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/FullWrite_2.0
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/HanMac_2.0.4J.hqx b/writerperfect/qa/unit/data/writer/libmwaw/pass/HanMac_2.0.4J.hqx
new file mode 100644
index 000000000..f86c2ef7e
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/HanMac_2.0.4J.hqx
@@ -0,0 +1,178 @@
+(This file must be converted with BinHex 4.0)
+:"R4PFh4SDJ"*9d4$5%eTG`%!!!"63J#3"&kS@8aC8`%!N!X&G'PdE'8!G!B3!*!
+,6LKF!!!HU!+ZEh-J)!!!!!,LB!#3"34Kk!!!6Z3!!%lFhHiJ!*!%4,[X!!$rr`%
+!!(30[!!!r`#3"!%!!2rr!(dJ%J"e8p*Ia!"D!(96dJ#3"dJ!!!")!*!&!3!"!!J
+N5KKcG@*UC@0d$3eXD@GZC5!b$A0eBQTPBh4QJ"9l8J"d!bi!!!QBr`#3"Iq3"!"
+1*j)!#J#3"8iT&!#3"XeH&l8!!!$lrrmJ%J"d$E`!!2m!!(3$5!!3q*`!!!!"!!$
+rr`"p)")!G925!!$rr`"p)")!G925!(3$fJCKGA4SEh)H!!)N$3#!!!"!J1D53)$
+JaJ"d$E`!!2rr#$%Z-#KbCABTI5!5!!-4[J"eCF`!G!3X!(dJ%J"d""S3FQ9YBA*
+V$3eXD@GZC5!b$ImJ!!!m[6JJ"!!$!!-4[J!!#+!!!)!fAm3!@J"e8p)!#8m)!*!
+&I+c-!%iR9!"d"!!!$4aZ!%iR9!!!!!%!!2rr!*!*G925!!F!G925!(3!G!#3"9"
+"2!"d""`!#b3Q!!XN*J'qRE`!G!"d"$!!#b4@!!XN9J"1*e5G[!"d!(3%3!!,4Pi
+!#dCH!%iR9!#3"8pBTJ"1*e4Ia!"D!'XR5J!)5,i!!&r%!&S!G3#3"9""2!"d"(S
+!#b3Q!!XN*J&3RE`!G!"d")i!#b4@!!XN9J"1*e5G[!"d!(3%RJ!,4Pi!#`#3*3)
+!N!B$'!*N!%EGZ`"'hEX!4Yfl!&8+&!"'hEX!4Yfl!KdL43,#pH`!!`!!!%J!5!#
+3"!-B!Q3!N!3$'!*ND`!&+!2m!!)!!!")!%J!N!3$'!*N!!%!!!"N!!!!!3!"!3%
+!!J!"*`m!!3!"!*!14P3!!!(M!aJ!!!!N!!%!N"V0KDLb!*!-c9iAf3!#b&!!N#!
+(E@&TE#"dE`#31!KYB@PXCQpbE3#30`aYB@PX)(0eBQTPBh3!N)!F@,%!"`!(!*!
+&!Y@V!!!!"!#3"!%"!3!!"J#3"+!!N!m%i!!!**3!!#JJ!!!jI!!!2iJ!!%Vk!*!
+'6PB!!%mb!!"2iJ!!8R)!!%q#!*!H8d)!!J#3""qd!!!!F!!5!!B!"!!!!!J!!3#
+3"8iQ6!"1*P!!6LCJ!%iQ4!"1+%J!6LK%!%iS2!"1+%!!6LC)!%iS0!"1+$!!6LJ
+X!%iS*!"1+#J!6LJi!%iQE!"1*QJ!6LJ8B'C+,`"5CJJ-E`!$!2aQ+%S[!&0R)NS
+[!!!"Z!$)!!!!!`!!!!`!N!F"!*!@)!#3&!%!N!S,#`X!N#3"!!%!!3!"!!%!N2m
+!N"Arr`#3#JG%C@CKG@ad!*!D!EJ"b!!!!!-!!!!-!*!(!3#3&L!!N"3"!*!+#`X
+,!*!N!3!"!!%!!3!"!*$r!*!9rrm!!3#3#!C)C@&NCA)!N"X"Z!,)!!!!!`!!!!`
+!N!F"!*!@)!#3&!%!N!S,#`X!N#3"!!%!!3!"!!%!N2m!N"Arr`!#!*!)"NC[Eh4
+PFJ#3'`'i!mS!!!!$!!!!$!#3"`%!N"BJ!*!8!3#3#JX,#`#3*!%!!3!"!!%!!3#
+3r`#3&Irr!!-!N!J&5@jNCAJ!N"`"Z!6)!!!!!`!!!!`!N!F"!*!@)!#3&!%!N!S
+,#`X!N#3"!!%!!3!"!!%!N2m!N"Arr`!%!*!)!e423`#3(J'i"FJ!!!!$!!!!#3#
+3"`%!N"BJ!*!8!3#3#JX,#`#3*!%!!3!"!!%!!3#3r`#3&Irr!!8!N!J)4Qp[G'j
+[G'8!N"N"Z!E*!!!!!`!!!"J!N!F"!*!&!3#3%#!!N"3"!*!(!3!!#`X,!*!N!3!
+"!!%!!3!"!*$r!*!9rrm!"J#3#!K)C@&ND@jR-3#3'3'i"mN!!!!$!!!!%J#3"`%
+!N!8"!*!3)!#3&!%!N!F"!!!,#`X!N#3"!!%!!3!"!!%!N2m!N"Arr`!(!*!)#%K
+PB@4TEQFb!*!C!EJ)b3!!!!-!!!!1!*!(!3#3"3%!N"!J!*!8!3#3"`%!!!X,#`#
+3*!%!!3!"!!%!!3#3r`#3&Irr!!J!N!J)5'9KC'PZCc-!N"N"Z!R*!!!!!`!!!!`
+!N!F"!*!&!3#3%#!!N"3"!*!(!3!!#`X,!*!N!3!"!!%!!3!"!*$r!*!9rrm!#3#
+3#!K)C@&ND@jR0!#3'3'i#XN!!!!$!!!!#J#3"`%!N!8"!*!3)!#3&!%!N!F"!!!
+,#`X!N#3"!!%!!3!"!!%!N2m!N"Arr`!+!*!)#%KPB@4TEQFe!*!C!EJ,b3!!!!-
+!!!!*!*!(!3#3"3%!N"!J!*!8!3#3"`%!!!X,#`#3*!%!!3!"!!%!!3#3r`#3&Ir
+r!!X!N!J)5'9KC'PZCcB!N"N"Z!c*!!!!!`!!!!`!N!F"!*!@)!#3#"J!N!X"!*!
++#`X,!*!N!3!"!!%!!3!"!*$r!*!9rrm!$!#3#!C96'PcG$%!N"X"Z!h*!!!!!`!
+!!!`!N!F"!*!@)!#3#$!!N!X"!*!+#`X,!*!N!3!"!!%!!3!"!*$r!*!9rrm!$3#
+3#!C96'PcG$)!N"X"Z!l*!!!!!`!!!!`!N!F"!*!@)!#3#%J!N!X"!*!+#`X,!*!
+N!3!"!!%!!3!"!*$r!*!9rrm!$J#3#!C96'PcG$-!N"X"Z!r*!!!!!`!!!!`!N!F
+"!*!@)!#3#"J!N!X"!*!+#`X,!*!N!3!"!!%!!3!"!*$r!*!9rrm!$`#3#!C26'P
+cG$%!N"X"Z"$*!!!!!`!!!!`!N!F"!*!@)!#3#$!!N!X"!*!+#`X,!*!N!3!"!!%
+!!3!"!*$r!*!9rrm!%!#3#!C26'PcG$)!N"X"Z"(*!!!!!`!!!!`!N!F"!*!@)!#
+3#%J!N!X"!*!+#`X,!*!N!3!"!!%!!3!"!*$r!*!9rrm!%3#3#!C26'PcG$-!N"m
+$M!!!!,!!%J!#!!J!!!!%!!)!N!6rrJ!!!%iS(2rq8#!!6LJ3rrj3)!"1*S6rrP!
+J!%iS#2rq8#!!6L6Frrj3)!"1*T!!rrj3)!"1*4MrrP!J!%iNd2rq8#!!6L8Xrrj
+3)!"1*6$rrP!J!%iNp2rq8#!!6L6Nrrj3)!"1*1$rrP!J!%iNk2rq8#!!6L6Xrrj
+3)!"1*2$rrP!J!%iP$2rq*q`!6LHd!*!&!3#3"!3!N!JN!!-!!!!-!*!(!3#3'53
+!!`!!!!`!N!F"!*!&!3#3%b3!!`!!!!`!N!F"!*!&!J#3%b3!!`!!!!`!N!F"!*!
+%#!#3&#3!!`!!!!`!N!F"!*!&"!#3%b3!!`!!!!`!N!F"!*!&#!#3%b3!!`!!!!`
+!N!F"!*!&%!#3%b3!!`!!!!`!N!F"!*!&)!#3%b3!!`!!!!`!N!F"!*!&3!#3%b3
+!!`!!!!`!N!F"!*!&`!#3%b3!!`!!!!`!N!F"!*!%!3#3&#3!!`!!!!`!N!F"!*!
+%!J#3&#3!!`!!!!`!N!F"!*!%"!#3&#3!!`!!!!i!N!F"!*!C*!!$!!!!%!#3"`%
+!N"NN!!-!!!!5!*!(!3#3'53!!`!!!"J!N!F"!*!C*!!$!!!!#3#3"`%!N"F"!*!
+%%9`!!!#J!!`!!!!-!!!!!J!#!*!%rri!!!"1*2J!N!6rrJ!!!%iP!*!&rri!!!"
+1*33!N!6rrJ!!!%iP#!#3"2rq!!!!6L8N!*!%rri!!!"1*43!N!6rrJ!!!%iP%0@
+V!!$rrJ!!!%iL+!#3"2rq!!!!6L)B!*!%rri!!!"1)N$d5!!!rri!"3"1*U3!!!!
+$rri!!J"1+13!N!B"B#!!N"3"!*!+#`X,!*!N!3!"!!%!!3!"!*$r!*!6!@!J!!!
+!!J#3%!%!N!S,#`X!N#3"!!%!!3!"!!%!N2m!N"-"B#!!!!!"!*!3!3#3#JX,#`#
+3*!%!!3!"!!%!!3#3r`#3%`&J)!!!!!-!N"!"!*!+#`X,!*!N!3!"!!%!!3!"!*$
+r!*!6!@!J!*!8!B!!N!N,#`X!N#3"!!%!!3!"!!%!N2m!N"-"B#!!N"3#!*!+#`X
+,!*!N!3!"!!%!!3!"!*$r!*!6!@!J!*!8)Y@V!*!)!3X,!*!N!3!"!!%!!3!"!*$
+r!*!6!@!J!*!8!3#3#JX,#`#3*!%!!3!"!!%!!3#3&38!N!Xp)N8"!*!)A5*&!`!
+!,J#3"CmL43#3#G-L43#3#!%-)N8!N,i"B#!!N"3"!*!+#`X,!*!N!3!"!!%!!3!
+"!*!9"!#3#cdL43%!N!KG)N8#!*!)HL*&!`!!,J#3"CmL43#3bJ&J)!#3&!%!N!S
+,#`X!N#3"!!%!!3!"!!%!(&La!*!*1,&M!*!&"3#3#cdL43%!N!KG)N8$!!!Z!*!
+&Rb*&!*!*db*&!*!)!3`L43#3[J&J)!#3&!%!N!S,#`X!N#3"!!%!!3!"!!%!N2m
+!N"-"B#!!N"3"!*!+#`X,!*!N!3!"!!%!!3!"!*$r!*!5!`#3"!B-!!!!E!!0!!F
+!"!!-!!S!!3#3"8iL-!"1)L`!%!!!!%iNc!"1*0J!6L(3!%iN0!"1)M3!6L)m!%i
+KZ!"1*[3!6LId!%iQ[!"1+5J!6LM-!%iS"!!)!!!!"!!"!*!(%!!!!%J!!!")!*!
+(0!B!$!#3"NEGZ`"'hEX#(5*&!X,el!#3"!*m'$%"eN5+!!m!N!G1+!!!6L4X!!!
+!4))!N!B(!(i!!!%L!!!!p!!!!BS!!!!,!*!1!BS!!!"q!!!")J!!!23!N!G1++!
+!!3#3"85#!*!'#!#D!!!"I`!!!6!!!!)$!!!!$!#3"K!!N"a1+,`!!3#3"85#!*!
+'!`()!!!"@!!!!I-!!!'-!!!!$3#3"L!!N"a1*p!!!3#3"85#!*!'!`&$!!!"I`!
+!!B%!!!'F!!!!$J#3"P'!!*!E6LC`!!%!N!9%JJ#3"J-"BJ!!!8S!!!),!!!"I3!
+!!!m!N!C4J!#3'diP(!!"!*!&2*)!N!B%!4m!!!%L!!!"a2mb!D2r-J!3!!!!2Aq
+C!%prQ3!"!*!&!J"1,3!!6LB3!*!&6LB8!!!!0!)!#!!!!3!!!%EGZ`"'hEX",!!
+!!V$el!#3"!*U'$%!j5*&!!)!N!AC!%iSP!"1*'`!!!!d!J!%%!!"!!!"1!!!!%E
+GZ`)G)N8#N[AX!*!%!N`B-3$P)N8!!3#3"I8!6LLF!%iNE!!!!$3b!3!!!!%!"3%
+i!!!#S2AX!KdL43+`pH`!#J!!!!`!!!$P)N8!!3#3"diQI!"1*q`!!!!d)J%!`2r
+r!!B!4Yfl!V$el!)G)N8#`[AX!!-!!!!3!!!"eN5+!!%!N!G1+*J!6LMd!!!!0#)
+"!)!!!3!'!%EGZ`+`pH`#(5*&!X,el!!$!!!!%!!!!GC%LJ!"!*!(6LLB!%iSp!!
+!!$6#!*!%!3!!!6J!!!+5pH`#(5*&!U$el!!+!!!!!3!!!3#3"!J!!!!#!!!!NJ!
+!!%iRp!!!!F!!#3!!!$!!!!!"!!)!N!6rrJ#3+!%"!3!!!2rq!!!!!3!!!!%!!!!
+"!!!!!3!!!!%!!!!"!!!!!3!!!!%!!!!"!*!%!3%"!!!!rri!!!!"!!!!!3!!!!%
+!!!!"!!!!!3!!!!%!!!!"!!!!!3!!!!%!N!3"!3%!!!$rrJ!!!!%!!!!"!!!!!3!
+!!!%!!!!"!!!!!3!!!!%!!!!"!*!%3!!!!!%"!3!!!2rq!!!!!J!!!%*rQ3"8IjN
+!!J!!!!%!!!!"!!!!!3!!!!%!N!4!!!!!!3%"!!!"rri!!3#3"3)!N!F#!*!B!3%
+"!!!!rri!$!#3"3)!N#!"!3%!!!$rrLaB!!%!!!!"!!!!!3!!!!%!!!!"!!!!!3!
+!!!%!!!!"!*!%3!!!&!%"!3!!!2rq+SJ!!3!!!!%!!!!"!!!!!3!!!!%!!!!"!!!
+!!3!!!!%!N!4!!!!!!83"!*!'0!!#!!)!#!!%!!3!!3#3"3)!N!G1*J`!N!91*-!
+4(!!!"9C8-6!`)"`!!!#%!!!!-!!(!!%!"!!!!!J!!3#3"8iKZ!"1)M`!6L)d!%i
+N0!"1)G!!6L6B!%iNc!#3"c!!"3!$!!3!!!!)!!%!N!91+!3!6LDm!%iSc!"1*r3
+!6LEd!!!5,!!+!*!%!H!!"!#3"!'d!!!!-!!%!!3!"!!!!!J!!3#3"8iNE!"1*K!
+!6LIX!%iSp!#3#a4P)(4[!!!!*J!!!33!!!$B!!!!f!"1*h3!6LDJ!%iN9!"1*h`
+!6L4N!%iQ-!!$!!!!-!!$!!8!"!!!!!J!!3#3"8iNc!"1*[3!6LIdFJc$`b"5)B!
+B%$!$8N!J8V"36qm!!!!Q!!!!"!!!!!)!!!!#!%iRH!"1*V3!6L4J!%iQX!"1*&`
+!N!8"!!!!-!!"!!F!"!!!!!J!!3#3"8iKZ!!)!*!*5!!!!%J!N!8"!!%!!3#3"5B
+!!!!0!!!!$!!!!!`!6LJ-!%iT1!"1*qJ!6LIi!%iQP!#3"3%!!!!`!!%!"`!%!!!
+!#!!"!*!&6LDm!qX!"!2X!!8$l3!'!qi!"`2[!!J$m!!*!r%!#J!!!#B!!!!+!!!
+!#J!!!!S!6LM8!%iT!!"1*VJ!6LNN!%iRr!#3"3%!!!!`!!%!"`!%!!!!#!!"!*!
+&6LNS!*!%#J!!8h4TBfYTCA-!N!30!!#P)&0SGA3!"3#3"!D9!!!#%!!6!#d!#!!
+!!%!!!3#3$3-!!!!"!!!!!`!%!!)!!!!$!!S!!`!!!!-!%`!%!!!!!`!D!!8!!!!
+$!#!!"J!!!!-!+J!(!!!!!`![!!J!!!!$!$-!#3!!!!-!3!!+!!!!"!!!!!X!!!!
+%!!3!$!!!!!3!$`#3"38!!!!0!!!!"3!%!!i!!!!&!!J!$`!!!!8!$!!3!!!!"J#
+3%8J!6KA%!3!#J!4'##d3%b!L3%5!UN#4)1)@"!N)#4!')!&!!)!"!!1!"mB2lar
+r2rjrr2rqIrmrrKrm$rJ2m!IJ!F!!J!!!!%`!6KA%!3!#J!4'##d3%b!L3%5!UN#
+4)1)@"!N)#4!')!&!!)!"!!1!"mB2larr2rjrr2rqIrmrrKrm$rJ2m!IJ!F!!J%G
+S!*!%!3`!6KA%!),rN!3!8%M8rrfpq34&C'Pd"99ZC'mJ!&S!!!%Y!*!%!d0eG!"
+B!!!+3fp`H5"3E'&TEJ"$!!!,8'&cG'8J8'aKD@i!9J!!"80XC@&b!*!%#P0PE'9
+MG#""E'`!33!!#84eF'aTBf&dC3"%!!!",3#3"!4'D@jN!"X-!!p*ER0PFR3J9Q&
+bD@&LE'8!'`)!$%PZFf9bG#"#FQ9KD`!E!`!+3Qp[Db"8EfpXF`!E"!!",3#3"!e
+(Eb"dEb"3B@F!!!)3!!S!0J!)!!!!3!!"!*!0"J!"!*!&"`!#!*!&#!!$!*!&#3!
+%!*!&#J!&@!J!6J!,!!B!!!!"!!`!#&J)!%i!$3!(!%EGZ`!1!!N!!!LJ!!!$(!"
+1&F3!Jrq3"!"3506rN!3%4QpZG"K"FQPKE#"09#"$EfjNC@jcC@3J6'PRD(3!N!3
+,3ACKER3J4f&bC'8!N!383QpNEfjT)%e8)&9XG(*K)%*[E'3!N!3(3Qp[DfeKEJ#
+3"!G$D'PMB@G[!*!%"d0[GA*TCA)!N!3)4'9XF'KTB@i!N!3*4A0`H5"6B@jc!*!
+%$N9cF(NJ8f&ZFb"#EfaN!*!%$'9AEh*XC#"8D@GSG!#3"!p(BA*KE@pZC#"1BA*
+bEhF!N!3'4f9ZCACK!*!%'%GTE'`J8f&ZFb"$EfjNC@jcC@3J3QpXC!#3"!P)C@a
+fCA4TBf%!N!325'9XGQ9dD@0K)%*XB@0V!*!%&%KPE(CPG'PMB5"$Efe`FQ9cFf9
+N!*!%#%YXB@jR)%e8!*!%$8aeBQ&XD@iJ4h*KF'J!N!306(9MD@4K)%*bD@GSG!#
+3"!G0B@0SD@jP!*!%"Ne[EQ&ME`#3"!K09#"&H(4bB3#3""*1)%KPE(CPG'PMB5"
+1BA*bEhF!N!3)6Q&ND@&ZEQ8!!!%3!")!,J!%!!!!3!!"!*!,$J!!!!m!!!!A!!!
+!B3!!!(%!!!##!!!!L3!!!)m!!!#8!!!!RJ!!!+8!!!#Y!!!![`!!!-B!!!$C!!!
+!p!!!!29iG#"09!#3"!42ERPi!*!%"NpiCQpbC!#3"!K3B@aKG'PZE`#3"!j6Bh*
+TF(3J693J3QpXC!#3"!96GfPZC`#3"!C6H@eLEf`!N!3)9'9XCA4PH(3!N!3&9'P
+YCA-!N!3(9&4C4QpZG!#3"!eDBA"Q)%0SB@jMCA*j!*!%$9TKF'BJ4'PZCf*KG(-
+!N!3%@Q9KE!#3"!T#BA0dD@pZ)&4$%4`!!!T$D'PMB@F!!!!d!!%!!3!3!!3!!J!
+"!*!+!3-!N!91*V`#!"%!!ri!&`2r!"J%!!!C"!%!'J!!!4@!hDr[`!8`fp48p2#
+I#6K492V8e4eCH9Ndf"ThNE"8#J,Y9@38$68540`54&hA&PY(39e38&"9(#N"A8`
+$S$Y1$8!&'"!3X&#532b6`pma5")0J-2C4X8$Bc*h*G+@A&8Gd#90eIB%PGB&KE%
+Af`9XJXm50YSc6JG35(4PV63!Y)8!"#8d!"("%P,a99B5"8R"j#-V&!m#&CGC80I
+PeK8m'A0i5a2EI*A,*$300$A@AY-FY2b5YT@8a4AFFXJ0*pH6JdhE9A88m(a382'
+0J892!A54(@fTCDl#'j0aQ5!,5c@P%3kf@&13!-3)#4PV9GANE-EDP9Y9%&9"C40
+0*(K0!9c5-,!IF64N-I$N@%j6%i,j&6)dr!!&!*!%!Bi!!!#3!!!"!!m!#!!!!"!
+!!3#3$J%Z!!!!*!!!&R!!!!"1,$!!6L`S!%iX*2rr!%iX2+T9UP@U9DT9!!!!2!!
+!&Q`!N!8"!*!&#!!)!*!*5!!!!%J!N!8"!!%!!3#3"8iX,!#3"!'U!!!!)!!!&QJ
+!!!!"!!!!!3!!rrm!!!#3!!!"!!m!#!!!!"!!!3#3$(rm+!S!J3%F!!8!N!QA$%P
+ZFf9bG#"8B@*XC3!S#J!!!%3!6KA%!*!r4!"1&F3!N!Y3!!8!#`!%!!!!%!!"!*!
+,!3!!!!)!!!!$!!!!"!#3#cJ!6KA%!*!BJ!!!*!!!!!D!qVB&CS!!"3#3"!'E!!!
+!N!!!!3!2!!J!!!!3!!%!N!N4!*!&J!"1&F3!#!!!!&"*P!"35A`!8%PN!&"*6!"
+3563!8%NF!&"*"!"351`!!!!m!%i9a!)!#!!!!3!!!%EGZ`"'hEX",!!!!X,el!#
+3"!*m'$%!j5*&!!)!N!AC!%iR6!"1*'`!!!!B!%i9a!#3"33!N!@3!!!#!!i!#!!
+!!"!!!3#3"`S!N!8"!*!(#!!"!*!(+!"1&F3!!IqG!*!I'!"1&F3!N!8#!!!!%!!
+"!*!('!"1&F3!N!8#!!!!%!!"!*!(+!"1&F3!!IqG!*!(8!!#!!i!"!!!!"!!!3#
+3#`d!!J!'!!3!!!!)!!%!N!91*'3!6L(B!*!(,!"1&F3!!`!!!!`!N!C999Ie!!!
+!'!!!!"1*B,N)$%,X6riHIqrKe@@Q3SkJ!!8!N!3"Q!!!!*!!!!%!$`!)!!!!%!!
+"!*!13fpZG(*[E#"3B@jPE(-!N!3,!!"'D@jN)%CTE'8!N!3+!!",CANJ3f&`F`#
+3"!S!!%j[G'8J8'&N!*!%&3!!8Q9MC@jd)%&`F'aTBf&dD@pZF`#3"")!!&*PBf9
+ZG#"%Ef0eE@9ZG(-!N!33!!"5C3!!!*!!!!%!$`!)!!!!%!!"!*!(#`#3$!X,#`#
+3*!%!!3!"!!%!!3#33e!!!3!2!!3!!!!3!!%!N%F3J0e[kFe[J(2VJSkkMT*33!!
+)!*!&$!#3"3J!N!8-!*!&#!#3"3`!N!8)!*!&$!#3"3J!N!8-!*!&"`#3"!')!!!
+!5!!#!!B!"!!B!!J!!3#3"!)#!!3"!!!$!!!!"!"1*i3!6L)J!%iRL!"1*i!!6L4
+3!*!E-!!#!!!!%!!!!!)!!3#3#8iNU!#3#`%!6L5m!*!,-!!#!!!!%!!!!!)!!3#
+3"`)!6Ld!!J#3"!%!N!8$!%iNZ!#3#c!!!`!&!!3!!!!)!!%!N!P!rjN!JImb!*!
+A-!!$!!8!"!!!!!J!!3#3#9,rQ3#Prc)!N"GJ!!)!!!!S!!!!!3!#!*!%rri!!!!
+"!*!%!3!!!3#3"!%!!!%!N!3"!!!"!*!%!3!"!3!!rrlQNJ!"!*!%!3!!!3#3"!%
+!!!%!N!3"!!!"!*!%!3!P!3!!!!`!N!AF!!!!!3!#!*!&b!!#!!!!A!!!!!%!!3#
+3#3%B!!(@4)S!N!C!J1D53)$JaJ!!!!%!N!935GJ!!2P8!!(j9!"1ECB!G!+X!%i
+bF!"d$E`!G!*b!!#%@J"1!*!9!3!"!!%S!!$P)N8!$!#3"%#!jT*!J1$'!!!!!3#
+3"9"*f!!!q93!!IP8!%jYPJ"d!U`!6M*`!(30[!"d!R)!!)4D!%i!N!P1+5J!6LM
+-MJ#3"!d!N!93)!!!!3!!!%!!!3!!!"3!(!!"!!%!N!91*q`!#!!!!!B!!!!#!!!
+!N!!!!!!"!!!"!!!!%3#3$%iRp!"1*V`!$`#3"@!!!!"8!!%!!!"%!!!!!3!"!*!
+&!`!$"NGPEQ9fB38#'`!%8b)!N!D!6MD8rrX!!%PA!(3#&LLN!!&B#!"c3J!!6LL
+-!%i!!!BM$E`!N!D%@J!+!*!%!T!!!!!!'!#3$8iXl!"1)L3!N!FU!*!*!Irr!%i
+Nc!"1*pJ!6LM)!!i!!!!"!%iS!)"P!F`!$J#3"4!!N!8%!!!!#!!"!*!(*!#3"3)
+!&!!3!!%!N"S"kJ#3#8iNE!!!!0J!!!$B!%iR6!!!!%iRG!"1*U#!9iRN)!#3$`(
+@4)S!!3#3#JX,#`#3*!%!!3!"!!%!!3!F@,%!N!NiX@-!N!8&!*!,25*&!3#3#&d
+L43-!!#i!N!@I)N8!N!R6)N8!N!J"$#*&!*#p!`!!!!`!N!F"!*!A6L4X!!!!JJ!
+!!38!%Rrr!6m!2!!q!BJ"LArr!8!!1`"1*'`!!!$'!!!""!!*!BS!N!3"eN5+!$X
+"M!'0Irm!!!!3!*!&"!!!!!S!!3#3"3X!N!A3!!!!2!!"!!!!,!!!!!%!!3#3"8i
+QA!"%!!-"h3*h!BS!Y!'D!QB!A3*P!BX#G3'+!Q8"L`*e!!!I4!#3"i3!6LJJ!!"
+I3!!!!Qi!!!C8!#F!!!!"!!!!!3!!!#F!!!'+!Q8!6LGX#!%!+J#3"!%!!CX!N!S
+"03#3"8iT0!#3"8iT3!"1)GJ!*`!!!BS#C3#3#9d#C3"G!R8!!"mN!%iNX!!"!!)
+!6L5J!%iQh!"1*Z"DcJ!!:
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/HanMac_2.0.6K.hqx b/writerperfect/qa/unit/data/writer/libmwaw/pass/HanMac_2.0.6K.hqx
new file mode 100644
index 000000000..59775ec23
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/HanMac_2.0.6K.hqx
@@ -0,0 +1,94 @@
+(This file must be converted with BinHex 4.0)
+:#QKKENeKBe4PFh3!4&*%-NK0C()"!!!!&jm!N!5p1NKC6&-#%!#3"!3X!!!AR`!
+!!Q`!6N#",mB!Fq5q3)%ddN#"03i!!!!`rrmJ!*!%"4!Zr`#3"rm"rrr)!!!9IEi
+!!pF+!!G`eJ!+!%i4N!"!J5eN!!!!%rq3"!&@!K!3,[m!N!3"!9B#%!!!!"0!J1P
+J!!!!(!!!!!)!!!!B!!!!%!&@![m!6f2N3)$Z5!jeEL"`CA4TG#"PFh0KDH4!J!#
+3"4F&B[m!N!3"!(hVk!"pdN3!IG*%!(2P%J"pqC3!IIQ8!!!!r`!!!2m!#`!%!!K
+!V!!A"@)!Fq@L!!G!0+!BNi+J'*1#!9B#%"!Zr`#3"rm"!!!!!3"1(X3"##CY!%i
+Ha!"cjMi!!!!4eQ`!6K,%rrr)!!!9IEi!!pF+!!G`eJ!+!%i4N!!$-5i`!!!!%rq
+3"!&@!K!3,[fEX#i!!3&@!K!!!3!6$R9Z)("PG'Pd)'9cFf&T'!!!!"!"9J,r!%p
+Mj%#!lNJ!G!2`!!#J)`"@dX`!6f2N3)!!N!8A"@,pQl!Z!!%!IH[S!(h54!"pdN3
+!FqAb!(hjP!"pqC3!!!$r!!!!r`!,!!3!#%#X!"F&BJ"cjS)!"d!dS"L6JU!BNi)
+"9J)3%#lpQl!ZrBd!!"aS!!&GS!"1(X3"##CY!%iHa!"cja3!!!!4eQ`!6K,%!3J
+!N!F(!!!HI,q5!!!H9!!!r`!"9J)3!!X!FqCf!!I!A!!!!(hVk!"pdN3!IG*%!(2
+QK!"pqC3!IIQ8!%iHa%#"ja)!6Kl%!!!!Q!!,!!3!Fmc+ChB!!!0!!#J!G!2`!!S
+35J!!K&S!F`"'!(2LQJ!!!2m!N!9d!*BJ#!"c!(1!MJ#3"3@J!d#!TDS!N!D!9Vi
+)!!!&1J!!rr`!F(28!(4G'!#3"!)!!(4IPJ"`ZS!!G!!B!*!%!J!!Fq+k!'1fPJ"
+dA4J!!!)!'$i!Fq+Q!!!!&!"ciUB!!!!85&P-8`)3!*!%"#`!N!Pc$R9Z)("PG'P
+d)'9cFf&TBiRH!(4IPS"@[JL!9X%8!(2LjJ"Lpa`!G&q'!(2M1J"LpY3!!`#3"2r
+m!!!&1JTS!*"(r!!#!!%!!3!"LGi!G&q@J&Dq#)"@`43!Fq,Q!',h(!"dAiB!Fq-
+k!',fe!!$!*!%rr`!!!8k#QJ!N$9cid)!B[6D!*!'J&B!!!"c!*!S$3#3"33X!*!
+*$!#3"!BX!*!*!`#3"!C*!*!*"3#3"!db!*!*"!#3"!he!*!*!3#3"!j6!%i`(!#
+3"3%!N!31TJ"1,f`!N!8'!*!%$[J!N!N(!*!%$i!!N!N)!*!%$r%!N!N,!*!%%!m
+!N!N+!*!%%#i!N!N"!*!%%&-!N!N*!*!%&j!!!*$r!*!U%J#3"4d!!!!4J2Uf2pj
+jPecrqq0`+"3rrkS!#3#3"!ET!!!'hB$TR8KcUSfS#U!!N!8#)!3Me(rrrrrSZ!"
+rrj!k8lIJ5Lf'hdXY0ZRrrrlBhCcQ#Kqrrj!&rKrhb9F!N!3Mrr`!N$S&J)SmdJe
+1iQiR4rrrkkD'&')rX[q3"ZVre!qJ!!!!!rbUS!#31KmQRJQENYX2SL8m!!!(29E
+m*QS"6!#3"N`!Kk!!!!!"rP93!*!k$S%`+RLT6$DfXP-5Z!!!&(r1f+`#)!#3"3+
+!&B8Irrrrqi!!Irq31NHX9S5ZKZ[r%UAAd!!!&hb'RNb!%J#3"JEJ$G#Mrj!%G8!
+$rj!kql!![4PP52CRK'9(rrrCFHl4F1iracb2rj!&(pCN(rrrrreA!!rrN$VU&jC
+R4b@Fk1pLk@C8TIrrr0F%ajf1(pAIGrq3"FIeM9r!!!!!"Re93!#31MCI1Nl86U1
+FS"3(Vk!!!'M@f@IEi(f'B!#3"!(!8bdr2rrrrr8!!2q31[la0XQTL0Q"$J83m!!
+!*Jp,b)D!q`c!!*!%!i#Qji!!!!!)Urr!!*!k5GplEb"BGF3`fJCrrrdL38h2rHI
+%rj!&mreKBIq3"0P3!2q31[l$!X861pDQTl!Mi!!!BST$aaJ4`9!!N!9!(VkJ!!!
+!!Ep98!#31Je%Q&`pK9Fph,m(rrrVSM*-2m*rrj!%3IrhIqdVrj!%b"99rj!krNG
+AFm+%%FA!p%'+'#B@IrrpPYchZA3%m!#3""jZ!&3!YU!!!!!"Re93!*!k$'C[S3Z
+plX`rRma@6mIrrqV!-!ehmhrrN!3RmrpIqJq(!*!%'998!*!k!l98G8bU,$FaKPU
+RRrrrHbaKHpjr4rq3"2!Ara2q!(MrN!6ae!!rrj!k[%l"0X2dI`LV3E)$4rrrfr)
+pTPd"R!#3"!48!&3![U!!!!!"Re93!*!k$&3KHGLNR9,'TP3Irrq+KQijVqFrrj!
+%KRrUrp*Arj!%Q#UVrj!kr-VKMV9)mIeh#90R!!!#AJ!,!*!&``!!!,H!pCa@2K&
+Ua8Z,(4b&QhJ-Z##R(U980N-Z9iQi)eS%c6Q0`2"+qbCqZMI5KcqH(Y#4j9PFFpJ
+IPC!!Z#8NVqRfI-@cH`&if-"Eei,q#e)BfZfi-ABl'B`QSaM,fhbrh!"p"rpD#B)
+N(+#j'iAZAYl4d(5ak2'4G`,,pLC1'q4R6eXTHh-GjaXcKXYi"8Jch3&cNBUfTFS
+j*S4ADl@DNPR&6XQ0$cck6,h1G[)flda%'jb'+61rITNk!!S!N!9H!!!!8S$kYUB
+!N!31k[N@#p"@9e5X&mif2j6bCVE,qHFpTk'SlP'[@K[AeUjcKURrD-ZV,fQQ&m2
+Si)J*DkiApM-M%)UDJc"ET2UVVlSrrj-BZZ(dG!!"!*!&8`!!!%H"IC*,YpFkrhI
+rkfeq9r9rrIrYNUi!N!4(rrJ!!&39&pC$9008K6eeH6Tp6AP&`!A!!-D(q"q!"J!
+aBArrrrra99Arrq3`!!%!N!95!!!!4S&pNNZhecVrGrrVEAjAmrrbrq-Am!!!!!'
+9IrJ!!%394$3(8K6elAj0TmEA&%d!5!!-B8d"F!"B!1A`!!!!!94rq!!!UB!!$!#
+3"BJ!!!"mJ2j$[L(0(NX-56rQh#qqrmkGkTM%Q,*Q*cB0EN1[&S1&LhhMV'Tjk,r
+j2PR`UdL!l1Zl"a18aq!0mXE,!h+aD!1M8BJ+Xm`m9E9%U4NJIm*[IPbcF8mR&h%
+0eRD"#pq@ZJ%-[6@lL3CF8dE0m-P89Y%'dp9TShPKQpE`J!!0!*!&F3!!!'@!dHA
+KiHFF*c(Gj&YRhA4`+6A@&h6D@L-2)23&AUDp*rrrrriQBD1C)+F58&bYAHJ-m'q
+e[4H'#aD5a*5E@SQRD6ViKRDUF+[@&(d"C`D$`!!R)!be@HJGcZe*(Cl'Vl&rq$P
+!`!!1!*!&(J!!!"+!qV1crrrrrX,SqrV%H[MrrmS!%3#3"4m!!!!6J1l@BbRF2r`
+hT@MB*b(`@02mF!!3!*!&*3!!!"Q!rQ!!N!J"*1Nd@P)NIfL@[iJ'3!!"!*!%"cd
+!!!FaJAf55lIA1[phrqYYIPIrrpArM&r!!!!!"PAri!!"%fI[AKH20@,a9pPq"dG
+mj1Ik3AR*,dG0GA"DrAkGKDVp9V+55'ebaji(i!",eG68aAeG)YSiJH3#!!#2Nd[
+2(L)U+)f!J!!Rq9K!6J(iB!B+eiAMA2a&RjeJ8!!5BIGfH!IKH`"1A9kI3EhVlCb
+4aq"-!!6TPA6aq"-%"8!C9EFI2eK&)CG6B'Ci%!!%&mVIeMi$!lY`$kl+&UkN--@
+K@'IKhKRi(rq11Tq(KRi(MT5IkIVLHQMV1S`crjTLH!`!!`VI2542!H%J!C(MRUp
+hhE3PR!FhMJPeGA(`(J!"8T%p+&`%"DX-!9e48[Y4GFraAB!9e0EGpr$rrH'TiFC
+jq[P4!(rVUSL!+#ZV2Jb4!GGehmrrmXG5pCehmq[r!m2#`c8&&D9PIP+EphIq'-"
+`qJ"[hh&qIpdqdC9%899&0I8f(pPHAXCcG["(+!F!!(SrClmjk!F2eJ"PNf"cp28
+l8Cqr[a389F&808%N"-!!BrlpR4,%N!!F1(F!B&dF8d08959pRRd4A'fD!'iZ5!&
+&3K53!*9K1*(G54NeY58G'i&3SJ"$I4RQMGTI"Q!'&!"Q&eCe29Kra&eC'!'jV`!
+6fA+QARmp'00@[&8@&GFk449E%`(j,d!&CC@IGAUGYkIQIeKE)b$@Aj`rarrm+Af
+l8G53!(5PD4)BA6NN(4E5mk"6"%68XG,r9rrdYX-'(CS5F&T-3%Sa%rAmG,2aGE5
+8Q"-G`FRr(m&r)meXcJ'-eG8A6RpId&SAm"'(Cd$93EXU1+IUrqSa1#1k9D@"bZ,
+bXVDLH[PRlR@U5!i"q*ri4AkRbqYQCLLpi+[MSUDUV"U@Vk+*TQRhVMZ)H-rZrqS
+-SbRTH$*)'#5FTSV#UL[J+#b)LCDU@6PKqCrq*CiF(i1`D'`5KS#eL1T`!'0rMri
+qZ+5'$"`6#)`JKSi+&VVpU)TLT#0RQLSKi'ILIri-(3L2*3aL[qq2f(rrNImr#2I
+rN!5+UUrrrj'0S9S1f*L'1S,l%3!!i!B[J!!!!!UMrm!!!YDX`q&M%JfFGJJL!!%
+`!PB(rj!%(8!$rrr@e9"@P&F3p18!#08Y4+fh2EHemb"-%h95#hfGl&rrpk@hrlh
+#Z!!!!!&Q99!!!'Mk"6e9PLqpE458*9'hF+3JQmM#YJ!"8!)A"Iq3"-%-&9rrrc!
+"N!#F-fYMGA90YCe+@J@---Fb$!&HP2rr'q#rlX23!!!!!Brq93!!"d5V4eT9Eq[
+I86dFI4bRA-UY-F!!!qQ`"kkJi!!!!!-+rr!!!+L&Xl,VIQerUFU92+da$hr*'-S
+$f(XBML1TPPSSa$NLFZ--!FTd[rrrrrQ#UVrrrMHL[+ML,kU*)D0#iR26H-%EP)I
+iarp19-!!!!!)kU2m!!!TkL1[mcTMrM5jc[$J'32d+)Dj)@J0+8Ik(VJ!!!!"4e9
+3!!"TpDrPmKR'&fe[*lmBN!#!"*C(9!#G!Iq3"-`99Irr-dAr9*IkSjer62kI@m+
+LNccA1Fq'[D"d)PGS2k,`UPVNZ#`T+r@LTU5kmLcMZZVSLPJd6*P'C'[hIArj8!)
+rmY,0IrrrrrQ#UVrri'rl@314K6"&jZa[3YbK%L9Z!aFE'DNG@(JBdj2LIrd8)hP
+C&5&0PHp9mEFBdd+kpE"RhTLf!"1*darcU&-!N!3QVrm!!++!)D"PIr%IC#rbjm*
+#Y[pUp[TQKqV)bE3,cF32j5@@X9CAk8N!&#d01&UAhcfcA-`D*b8qZ-[!"EdB+Ar
+)[A!!!!!#c+UJ!!`Z`$hVG2rbclPE[-A%PbrcbQ2ESchIU0AAiXiQq!3`$`F('Lk
+Ybb+*bZEC)eXLeYZPRE5XGHHhJ!b5YYJ"@&(rN!5LDU[rrLErTU+@pi[!Q-lKm4h
+i3jqe53mjRI[GF*m$8-c5-$3K!Pe(aa,B8e#jGbJ6)"!E")8dp%hjB@)lrlrpL&p
+2AjPPXrq3"-e99rrm9rcp[kX`0-&Rql-hK"K8RkYS--jB6X3p8`6fhGK)dM%F3%p
+Keq6a*4P9p'8"9IdCfde[+QQB!%@cTc,bM,pHqCrrrrrqq+U[rrLfrkTP0hLQ#Kc
+q0E1V+M6p@fQXYDreNBr2U&3S6VTd*i%Bj5(5"iq%LB'$J91b%X0$T"N'Ir)h6!6
+mUld(rj!%`$99rrm+PrhC,LIl*F%(qD"TLYU0HH5@fk`VbAN@Y!rqT*drPrrHkqe
+T%dUUHMQZh5HV--5`!1e'5&r`3X$!!!!!$k2r`!!VU!*$[VaKkr%Ch0$F3C,Zc`f
+FcH(@,*HPqR'BK"ILaaSU+L"qrVDTUr#qG@Zq*C[mrNIrk1'[[2HLIj`U)!h`,!!
+#m8[&)VEFrjT!+!!HMMVK"$#rrj2,UrpGBRRrN!6YQUVrriA[qd[(icTJRjIkaBG
+fqVGVUU#,+hMeiS#RfkQ[`!!2!*!&$`!!!!1!rT!!`lm!!!:
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/LightWayText_4.0.hqx b/writerperfect/qa/unit/data/writer/libmwaw/pass/LightWayText_4.0.hqx
new file mode 100644
index 000000000..a1b9c1e5f
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/LightWayText_4.0.hqx
@@ -0,0 +1,16 @@
+(This file must be converted with BinHex 4.0)
+:#(4PH(3d,Qah!&4&@&4-9e4&!*!&i`!!!XMFSd%JFfeKE'`J6'PRD(4ABANJ9'9
+iG#!d,M80BQpXC#"TG'&XD@-JG@jNCA*XD@jP$6%i)("[D@jdFb`J-6)JF'pTER4
+c$80SD@0KCfmX)%0[GA*TCA)0$5m[)#!YN#S0,bmJ)&4SDA-JC'pMG@ePER3JGf&
+c)'eKC'8JGfPdD#"-D@GSG&GKH94PH(3Z$5m[)#!YN#S0MTi!!!%!!!!#EJ!!!@i
+!!!"D!!!S[3C'D@jNCA)!N"8)G'9iG$3ZE(F!!J!!!&4&@&4-9e4&!*!-9%9B9%a
+A9%8!N"M2Y6K"!!!!i`!!!XJ!N!`'e58!!!!S[3Y0FeG[FQYc8(*PCJ#3&i`P!!!
+!+,d26h"dD@pZFb"N*d9iBf9X!*!5"XdP!!!!+,d,8(*PCQ9bC@jMCA-!N"(b!!`
+!N!8,!!N!"!!!!!N!N!ND!!X!#3!%!3!!#3#3#4i!#`!*!!3!!!!*!*!*(`!,!!N
+!"!)!!!N!N!NP!!X!#3!%!!!!#3#3#5B!#`!*!!3%!!!*!*!*,`!,!!N!"!!!!!N
+!N!N`!"J!%J!%!!!!%J#3#6X!%!!-!!3!!!!-!*!*43!3!!`!N!8-!*!*6J!-!!S
+!&J!!!!`!N!P@!!`!#J!$!!!!#GeV#-)'SJ!!!%J!$%GPEQ9fB3#3'`3!"!!q!!-
+"h!*m!$i!!`(F!N(2Y6K0!!!!'3!!!"N!N!NS!*!'!3%!!3-B!Q3!)J!L![B#3J#
+3"!-B!Q3!!3!!!!-!!`$5!!!"!!!!!Qi!!!&Z!!!!@J!Hr83D&!!!!"`!@J!#Fh4
+jE!!!!"T08&05!!!!*NaA8e)!!!!b!)$rr`#3#!2Yrrm!!!$f!*!%!qMrr`!!!8)
+!N!65SJ:
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/MacDoc_1.0.hqx b/writerperfect/qa/unit/data/writer/libmwaw/pass/MacDoc_1.0.hqx
new file mode 100644
index 000000000..b60c596d9
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/MacDoc_1.0.hqx
@@ -0,0 +1,41 @@
+(This file must be converted with BinHex 4.0)
+:#R4PH(3a,QeNEf-!684NBde%GR)!N!J(r$Q"!*!%!3!!!!H#!!!'JJ!!!(TKG'0
+[68*-6Im!N"F+G'9iG$%ZE@4[B`!#!!!!684NBde%GR)!N!T04'4M684fFJ#3'-q
+e0)3!N!B(r!#3$6BP!@&dBfp8B@*Xr`#3(K)P!@&dBfpA8d98r`#3(UmP!@&dBfp
+PC(4dr`#3'%!"-)!#!!!'GM%Z-bi`-M%Z-b`JU6%j16FJE@&MEQ9dD@-JFfpQG(G
+KFQ8Z)%&XE#"5D@GSG(-J8Q9cCA*fC@3Z!!!!,!%`J!)!!!Cf-5ic,M!H3h*PBA4
+PC#"hDA4S)(4SC5"0B@0%Ef-J9h*TG'9b!!!!r[e8D'Pc)'4[Bh9YC@jd)(GKFb"
+MFQ9KG'9N)(GTG'JJG'KP)%eKBd4[Bb"AFQPdCA)JB@jN)'0KEL"LC5"bC@&N)'&
+ZC#"`FQPZG'9N)(GTG'JJG'KP)%eKBd4[Bb"@D@9hCA)Z$3e'Eh)JCR9bG'KPFL"
+TEQC[FQeKG'P[EL"KBQpeG#"0B@0%Ef-X)("XC@&cC5"fDA0TG#"[GA)JGf9L)(0
+TG'8k)(GhGbjYB@0ZCA4TBbjNC5"[FL"MEfjdB@0d1L!0$8PZG'9bEQ9d1L"TEQC
+[3'eKBfjPG'PM,Q4P$80[EA"e8f9bGQ8k)'eKBfjPG'PMAh0[CR4hBA*P!!!%N!3
+!N!3$'!*N!"%#r``!rri!!!")!!!!5!#3"J-B!Q3!N!8b!$Z!!J",Iri!-J!lJ!)
+!5Arq!#`!#`!3#&"KE'&dD@j[!!!$!"!!$3!-!#i!"!#3"5Y%459K)(0YB@aX)%&
+MG'%JCQPXC5!SFf&fC@3JGfPdD#"0B@0%Ef-T!!%!#J#3"!-B$k!!F3!D!$m!0`"
+&!$S!2`!h!%8!0`"#!$S!2`!h!(!!'J!r!$F!43!k!$m!0`"&!$F!3J!k!$m!0`!
+"!!S!1`"$!%N#-`!k!#N!*@%JFfeKE'`J3@0dB5"QD@aP)#KcBACPC#"hDA4S)%e
+KBd4[BbN!!!%!#J#3#6)!5B!#!&GrrJ!k!!3"!!!U$J4LEfaN!!3!!!!T'!%J!!!
+%!J!!+3-'DA4KE'PM!!3!!!!T'`%J!!!%"!!!+3-*G@jNCA*XD@jP!!!"!!S!N!3
+$'!qJ!(%!'J"0!$F!8`!k!%d!0`"6!$F!8!!k!%d!0`"`!"S!63!h!&-!1J"0!$F
+!8`!h!&!!1J"0!$F!!3!+!%N!3`"A!M-!1J!%!3!!+!"6!%3%BQpXC!!!"!!!!#N
+B!5!!!!3#!!!T!`CTG'&XD@-!"!!!!#NE!5!!!!3%!!!T!`PeEQ4PFQaTEQ8!!!%
+!#J#3#6)!9i!#!'9rrJ!b!&H!!J"VIri!"!!!!!d!%J!S!'B!4!Sa1#"`EfPZG(-
+J!!!0!!`!+8d*-6)JF'pTER4c!!!"!!S!N!3$'!qJ!(%!'J"E!$F!B3!k!&X!0`"
+K!$F!AJ!k!&X!0`"`!"S!@`!h!'%!1J"E!$F!B3!h!&i!1J"E!$F!!3!+!&F!3`"
+V!M-!1J!0!")!+!"Q!%3+-6JJF'pTER4c)!!!$3!-!#P0#6%b)("[D@jdF`!!!3!
++!*!*-J"VJ!)!Ihrq!$)!Di!#!(YrrJ!X!!S!&JG$Eh9bD@9b!!-!&J!S!(F!4!K
+$Eh9bD@9b)!!!!`!!!#Ni"d0SD@0KCfm!!!%!#J#3"!-B$k!!F3!D!'m!0`"e!$S
+!E`!h!(8!0`"b!$S!E`!h!(!!'J"[!$F!G3!k!'m!0`"e!$F!FJ!k!'m!0`!"!!S
+!D`"$!(X#-`!k!!-!&J!S!(F!4!K$Eh9bD@9b)!!!!`!!!#Ni"d0SD@0KCfm!!!%
+!#J#3#6)!Hi!#!)YrrJ!k!#J!K`"8"f&Z)'PdC@d!!3!+!*!%!aJ2S!"a!"S!I`"
+(!)8!5J"r!%F!K3"(!))!5J"r!%F!F!!D!(m!4`#&!%S!I`"(!)8!4`##!%S!I`"
+(!!%!#J"l!&-!L`)c!$S!+3!(B@iJDA4PE3!!r`!!!3$fIE")r(i!3)c-CEVmIJ"
+!l@9%m9lCbjS!QIhE!2a`$JfVhXcMm4-Mc-#p)rJr0fkV*&TpP'B#4Z85)L$rCJB
+XrfB#**@D49&f`P9'P1DH*3#CANEYUV@'Rq+UZ9"fZlQ[Q@[hrb#D5'Gk@bLVCa6
+iGf9@5llBLJ$+Ca(-l@IN*@J%D9K9"'i3T(&0#IS%E[f3!,h!L84RrGZi95Nil'F
+4`*aR5$3iDNr28D4LcjQ$YjE0X@QNG!`h++"R&VMfGN3SAj&`$(&R%8#NB45!-Q%
+9)LGK+2VdB4C84NHm8pFI,AKXB5M)ef%SqNUbbM46CaC-rS)',$X%D8`'KHF%rfF
+4p!!!!3!!!!H#!!!'JJ!!!(S!BQX`'qS!!!!F!(S!!hCPFR-!!3!L8e45)!!!!$T
+04("R!!!!4Ne%Eh!!!!"5!!(rr`#3#3,rr`!!!%3!N!5rmrrr!!!!G!#3"3(rr`!
+!!AB!BQXJ!)$rr`!!"Ai!N!5a4`:
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/MacWrite_4.5 b/writerperfect/qa/unit/data/writer/libmwaw/pass/MacWrite_4.5
new file mode 100644
index 000000000..725f9ad4f
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/MacWrite_4.5
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/MacWrite_Pro1.0 b/writerperfect/qa/unit/data/writer/libmwaw/pass/MacWrite_Pro1.0
new file mode 100644
index 000000000..82e5d8608
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/MacWrite_Pro1.0
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/MarinerWrite_1.6L.hqx b/writerperfect/qa/unit/data/writer/libmwaw/pass/MarinerWrite_1.6L.hqx
new file mode 100644
index 000000000..9ec88a892
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/MarinerWrite_1.6L.hqx
@@ -0,0 +1,222 @@
+(This file must be converted with BinHex 4.0)
+:"(4PFh3!68*#9%e03N)"!!!!1)i!N!3drdD3"$#3"cB`-$!a-$!a4!%h0d&"!c#
+3#MK#-*!)!M%`-$&%!M%#,6G&4N)h488`!MJ`N!B#-!*&JJ)d1$!`0$J#,6)#16%
+#0c%a!6!"-6!"088"0M8#,6+#!N-a!N-c!N-a!N-c!MBb43)``J8#1$-#0$J#0c%
+a!M)`0J&'N!5"J3%`JS)#-3)d4$4%0$)d-J)a-$3#-!)b3J)`!N8c!63i!6!$-$!
+`-6#3"M3e-*!(-3)`!M*%33&"-$Jd!M!"-N3#-!%b4!)`!MNa!M3i!MFa-3)b-$B
+"-N4"!6!"-`%i46!`!6)#0c!e!M3i!MFa-3)d1!)`!c!`-$)`N!8b46#3#3!b4%%
+X9@iJF'9dDA3JG'9cG!d0Bf9ZG'9b$A*TCfKd$@TeFh4TCRN0DR9cG'PQH5"KE'`
+J$@*eE'aPG!eTEQ4PER3JD@i0B@j[G'KPFL"TEQ4PER30BR9XE'9d$6%Z05"TER4
+PFQaTEQ80-L"TER4PFQaTEQ80-6)JF(3JD@jdCA*XD@jP$@4PCQ&eE(3JG'PYC5!
+a-Jd0C'&dC5!a-Lma-Lma-JeNBA4P)&YG)'&ZC#"dD@eP)&YG)("KCf8JER9YBQ9
+b)&YGF'&RC5"MEh9ZG&YG)("KCf9ZG@eLCA)[BfpeER3J@ed0$@C[ER3JG'PYCA-
+X)'0[GA*TCA)X)'4PE("SD@&Z,#"PFh"j,#"YEfjKBfmX$6%b)("d,#!a0#"`G#`
+J-cBJF(3X)!eZEh*YB@`X)'*[E'3X)'PdB@aTBb`JG@jNCA*XD@jP,#"hEh*N)(9
+ZC'9bE'PZC5`JC'pdG'9N)(9ZC'9bE'PZC5`JC'peBQaP)(9ZC'9bE'PZC3e[GA4
+XD@jP,#"cD'&NEhFX)'0[EQ4PER0P,#"PH(4PEQ3X)(0dFQPVCA4SFR8X)'*[H'&
+XE'CXB@Gc$@0[E'pb)'*XB@0V,#"RFQ&j)$3e*5`JB@0aG@%XFh9`CA*cBh*TF(4
+cG@*cBh*TF(30CQPbFh3J-#ib03eXC@Cd)$!Z-M80FQPRD(3J-#ie$A4KBR-JE'9
+QG#"MC@jdCA)JFQPRD(3JC'9MD@eKE!ecB@eP)(GTG'JJE'9KC'9b$6-JF(3JBQ9
+QEh*P$6-JF(3JB@CdCA)0@eeEAA0[E@8JCQp[G'j[G'80+#"K)(*eE'8T$9YG$5J
+JB@j[G'KPFLN0@ed0+#"K)'4[G@*XC5!T$9YG$5JJEfjP)(GTG'JJF'&dG'9bEL!
+T$9YG$3d-F'&RC5"LFQ9KD`dIFfpQG#"SHA!ID'9Z)&938%953d&643ecEfeP)(0
+jE@*[E##hZ-)0$3-`-$!d-*!&-60%-*!'-c3#-)%#36B"-J*"1!%c!N%j!6!#3M)
+"-3*#0!%c!N-a!6)a!N-c!6-#3d3"-M)#3dB"-`*&-3%b-`*&-`%c!NBa!63#4N%
+"03)a-$3"0J)a-%%"0`)a-6)"-`)a-6N"1!)a-M!"13)a-MF"-`)a-c!"33)a-cB
+"3J)a-d8"3`)a0$N"4!)a06N"43)a0N)"4J)a0d)"-`)a0d-"-6!#-6Je!6%a!M%
+i4!%a-J)a16F"-6-#-6P'!6%d!M&"3J%a03)a388"-8%#-8)f!6-#-8-d!6%f!M&
+$43%a0`)a4$3"-6J#-84'!6%j!M&&1!%c!M)d4J%a3J)b06%"-8-#-M8c!6-#-MC
+#!6&%!M)f4!%c!M)h13%a43)b0d)"-`)b1$N"-8B#-MK#!6-#-N%a!6)`!M*"-`%
+c!M*%3`%c!c!`-$8`N!Bh4$#3"M%h!M#"!NB"-3)a0J%b!M&$!6-#-M3"0!)c-3%
+e!M-i!6B#0$)"0`)e-3%e!M8i!6J#0MB"13)h-J&"!MJb!6!#-88j!8)#-8Bd!8-
+#-8C&!83#-M!i!88#-M)h!8B#-M-i!6%`!M)d0!%a-3)b0%B"4J)b4%%"-!)b4%-
+"-!-`-$!f-*!&188b-*!'-M3"-`%`JB%"13%c!6#"JS,""!&'N!5"J3%`!N-#3c#
+3"!)``JS#-`)``JI"))+#`31#J3%a!6!"13%c!6#"!M%`N!8#--%%!8D3")'"!6!
+#3`*$-*!%!M$##J)a!M##JJ)h06-c0$!#-))#-J)d46&%0N-"--%IJS,"!i+"!6%
+"-!%j!6-"-)%#-6#3"3)``33"4T!%JB%"-!*$!N-`N!3#--)+!M%#-)+#!MFe-c-
+d-!)`!MB#0!)d46&%0M3"--%IJS,"!i,"!`%j!6-"-)'#JX%%!8D3")'"!6!#3`*
+$-*!%!M$##J)a3`)`JS)#0c8c-c3`!M$#!m%JJS,"!i)"-3%`J3&"!6)"-)'#JX%
+%!8D3")'"!6!#3J*$-*!%!M$##J)a!M##JJ)h06-c0$!#--)$`5##JX%$JJ%b!6#
+"!8)"-`%`JB+#`33"4T!%JB%"-!*%!N-`N!3#--)+!M%#-)+#!MFe-c-d-!)``J2
+"))+#`31#!6-"-)%"3`%c!6#"JS,""!&'N!5"J3%`!N3#3c#3"!)``JS#-3)`JS)
+#0c8c-c3`!M$#!m%JJS,"!i)"0!%`J3&$!6-"-)'#JX%%!8D3")'"!6!#0`*$-*!
+%!M$##J)a!M##JJ)h06-c0$!#--)$`5##JX%$JX%$!8-"-`%`JB+#`33"4T!%JB%
+"-!*&!N8`N!3#--)+!M%#-)+#!MFe-c-d-!)``J2"))+#`31#`3-"-8)"13%`JB+
+#`33"4T!%JB%"-!)b0!)b0$#3"!)``JS#-3)`JS)#0c8c-c3`!M$#!m%JJS,"!i,
+"!`%j!6-"-)'#JX%%!8D3")'"!6!#4!*$-*!%!M$#!`)Y-6#3"!)``J8#-3)`JS)
+#0c8c-c3`!M$#!`%Y-3%``4k#JX%$JX%$!6N"-`%`JB+#`33"4T!%JB%"-!*$!N-
+`N!3#-!)c!M$##!)a!M##JJ)h06-c0$!#--)$J3%Y-3%``4f#JX%$JX%$!6N"-`%
+`JB+#`33"4T!%JB%"-!*$!N-`N!3#--)+!M%#-)+#!MFe-c-d-!)``J1"J3%Y-3%
+``4b#JX%$JX%$!6N"-`%`JB+#`33"4T!%JB%"-!*$!N-`N!3#--)+!M%#-)+#!MF
+e-c-d-!)``J2"#!%Y-3%``4D#JX%$JX%$!6N"-`%`JB+#`33"4T!%JB%"-!*$!N-
+`N!3#--)+!M%#-)+#!MFe-c-d-!)``J2"#3%Y-3%``4@#JX%$JX%$!6N"-`%b!6#
+#JX%%!8D3")'"!6!#3`*$-*!%!M$##J)a!M##JJ)h06-c0$!#--)$`3F",6%"--%
+AJS,"!i,"!`&"!63"-)'#JX%%!8D3")'"!6!#4!*$-*!%!M$##J)a!M##JJ)h06-
+c0$!#--)$`3-",6%"--%EJS,"!i,"!`&"!68"-)'#JX%%!8D3")'"!6!#4!*$-*!
+%!M!#-3)``JJ#-3)`JS)#0c8c-c3`!M$#!m%%!5da!6$"'S+#`31#`3-"13%c!6#
+"JS,""!&'N!5"J3%`!N-#3c#3"!)``JS#-3)`JS)#0c8c-c3`!M$#!m%&!5da!6$
+"'B+#`31#`3-"13%c!6#"JS,""!&'N!5"J3%`!N-#3c#3"!)``JS#-3)`JS)#0c8
+c-c3`!M$#!m%'!5da!6$"')+#`31#`3-"13%c!6#"JS,""!&'N!5"J3%`!N-#3c#
+3"!)``JS#-3)`JS)#0c8c-c3`!M$#!m%,!5da!6$"%i+#`31#`3-"13%c!6#"JS,
+""!&'N!5"J3%`!N-#3c#3"!)``JS#-3)`JS)#0c8c-c3`!M$#!m%6!5da!6$"#i+
+#`31#`3-"13%c!6#"JS)"1*!%JB%"-!&'N!5"J3%`!N-#3c#3"!)``JS#-3)`JS)
+#0c8c-c3`!M$#!m%JJS,"!i,"!`%j!6-"-)'#JJ%fN!3"4T!%!813"!%`!8D3")'
+"!6!#3`*$-*!%!M$##J)a!M##JJ)h06-c0$!#--)$`5##JX%$JX%$!8-"-`%`JB+
+#`33"4T!%JB%"-!*$!N-`N!3#--)+!M%#-)+#!MFe-c-d-!)``J2"$!%c!6$"%S+
+#`31#`3-"13%f!6#"JS,""!&'N!5"J3%`!N-#3c#3"!)``JS#-3)`JS)#0c8c-c3
+`!M$#!m%0!6-"--%4JS,"!i,"!`&"!6B"-)'#JX%%!8D3")'"!6!#3`*$-*!%!M!
+#03)`JJ)Y-6#3"!)``J8#-3)`JS)#0c8c-c3`!M$#!`%Y-B%"-!%Y-B%"-!%Y-3%
+``3-",6%"--%'!5da!6$"#i+#`31#J3%a!6!"13%c!6#"!M%`N!8#--%%!8D3")'
+"!6!#3`*$-*!%!M$##J)a!M##JJ)h06-c0$!#-!)a!NB`!M4&-83e1!%``4-"13%
+``3U#JX%$JS%"-3%`!6N"-`%`J3)a-*!&!M$""!&'N!5"J3%`!N-#3c#3"!)``JS
+#-3)`JS)#0c8c-c3`!M!#-3*'0!)d46&%06!"--%6!6N"--%+JS,"!i+"!6%"-!%
+j!6-"-)%#-6!b-$!d!M$""!&'N!5"J3%`!N-#3c#3"!)``JS#-3)`JS)#0c8c-c3
+`!M!#-3*'0J)d46&%0c3"--%IJS,"!i+"!6%"-!%j!6-"-)%#-6!b-$!d!M$""!&
+'N!5"J3%`!N-#3c#3"!)``JS#-3)`JS)#0c8c-c3`!M!#-3*'1!)d46)`-%-"--%
+IJS,"!i+"!6%"-!%j!6-"-)%#-6!b-$!d!M$""!&'N!5"J3%`!N-#3c#3"!)``JS
+#-3)`JS)#0c8c-c3`!M!#-3*'33)d46&&4N-"--%IJS,"!i+"!6%"-!%j!6-"-)%
+#-6!b-$!d!M$""!&'N!5"J3%`!N-#3c#3"!)``JS#-3)`JS)#0c8c-c3`!M!#-3*
+'3`)d46&%0$!"--%IJS,"!i+"!6%"-!%j!6-"-)%#-6#3"3)``33"4T!%JB%"-!*
+$!N-`N!3#--)+!M%#-)+#!MFe-c-d-!)`JJ*'43)d46&%-cJ"--%IJS,"!i+"!6%
+"-!%j!6-"-)%#-6#3"3)``33"4T!%JB%"-!*$!N-`N!3#--)+!M%#-)+#!MFe-c-
+d-!)`!M%#-6!b!M4&-83c-!%``4q#JX%$JS%"-3%`!6N"-`%`J3)a-*!&!M$""!&
+'N!5"J3%`!N-#3c#3"!)``JS#-3)`JS)#0c8c-c3`!M!#-J)a-$3#0%8a4$)i!6$
+"(i+#`31#!c!`-$F`N!9"-6%`N!Ba-J%`JB(#$-%%JS'#!M3#--)'!M%b!6$"!`&
+'N!5"J3%``J6""!&'N!5"J3%``35#JS%#-M3!0$!X!*"!!6#"JB,"!i)"-3%`JF)
+-`35#JB)#-3)``JB#-6)"--%$!8D3")'"!6$#"-%%!8D3")'"!6$"")+#J3)b0!!
+d-#`!N%!"-)'"JX%$JJ%b!6#"`Jc"")+"JJ)a!M$#"J)a-J%``3-"4T!%JB%"--)
+%`33"4T!%JB%"--%%JS+"!M)d!$3`,!#33!%`JB'#`31#!6-"-)(#$-%%JS'#!M%
+#--)'!M%b!6$"!`&'N!5"J3%``J6""!&'N!5"J3%``35#JS%#-M3!0$!X!*"!!6#
+"JB,"!i)"0!%`JF)-`35#JB)#-3)``JB#-6)"--%$!8D3")'"!6$#"-%%!8D3")'
+"!6$"")+#J3)b0!!d-#`!N%!"-)'"JX%$JX%$!M%b!M!#,6%b!M$##-%%JS'#!M)
+#--)'!M%b!6$"!`&'N!5"J3%``J6""!&'N!5"J3%``35#JS%#-M3!0$!X!*"!!6#
+"!6%`-$!#--%$JX%$!M-f!M!#,6%b!M$##-%%JS'#!M%#--)'!M%b!6$"!`&'N!5
+"J3%``J6""!&'N!5"J3%``35#JS%#-M3!0$!X!*"!!6#"!6%`-$!#--%$JX%$!M9
+"!M!#,6%b!M$##-%%JS'#!M%#--)'!M%b!6$"!`&'N!5"J3%``J6""!&'N!5"J3%
+``35#JS%#-M3!0$!X!*"!!6#"!6%`-$!#--%$JX%$`J-#-6J`-$!#--)(`35#JB)
+#-3)``JB#-6)"--%$!8D3")'"!6$#"-%%!8D3")'"!6$"")+#J3)b0!!d-#`!N%!
+"-)'"JX%$JX%$`J-#-M#3"!)``JI"")+"JJ)a!M$#"J)a-J%``3-"4T!%JB%"--)
+%`33"4T!%JB%"--%%JS+"!M)d!$3`,!#33!%`JB'#`31#`32#"3*$-*!%!M$#"F%
+%JS'#!M%#--)'!M%b!6$"!`&'N!5"J3%``J6""!&'N!5"J3%``35#JS%#-M3!0$!
+X!*"!!6#"JB,"!i,"!i+#!M%b!M$##-%%JS'#!M%#--)'!M%b!6$"!`&'N!5"J3%
+``J6""!&'N!5"J3%``35#JS%#-M3!0$!X!*"!!6#"JB,"!i,"!`)a-J)`!Lda-J)
+``JM"")+"JJ)a!M$#"J)a-J%``3-"4T!%JB%"--)%`33"4T!%JB%"--%%JS+"!M)
+d!$3`,!#33!%`JB'#`31#`31#!M%b!M$##F%%JS'#!M%#--)'!M%b!6$"!`&'N!5
+"J3%``J6""!&'N!5"J3%``35#JS%#-M3!0$!X!*"!!6#"JB,"!i,"!m)-`35#JB)
+#-3)``JB#-6)"--%$!8D3")'"!6$#"-%%!8D3")'"!6$"")+#!63#-3)a-J)`JJ)
+b!M)f!M##!M-#-dB#-))#0!)e-3)`JJ)b0!!d-#`!N%!"-)'"JX%$JX%$`Jc"")+
+"JJ)b!M$#"J)a-J%``3-"4T!%JB%"--)%`33"4T!%JB%"--%%JS)"0!)a!M%b!MB
+a!M!#-J)b0J)`JJ)c!M0'!M##!M3#06%#0M)#-!)b0!!d-#`!N%!"-)'"JX%$JX%
+$`JF#-`)``J2"")+"JJ)a!M$#"J)a-J%``3-"4T!%JB%"--)%`33"4T!%JB%"--%
+%JS)"0!)a!M%b!MBa!M!#-J)b0J)`JJ)c!M0'!M##!M3#06%#0M)#-!)b0!!d-#`
+!N%!"-)'"JX%$JX%$`JJ#-`)`JS,"")+"JJ)a!M$#"J)a-J%``3-"4T!%JB%"--)
+%`33"4T!%JB%"--%%JS)"0!)a!M%b!MBa!M!#-J)b0J)`JJ)c!M0'!M##!M3#06%
+#0M)#-!)b0!!d-#`!N%!"-)'"JX%$JJ-`-$!i-*!&-NBf-*!(03!d-#`&9'PYCA-
+!N$Xd-#`'4f9ZCACK!*!j!63"-!%a0!%``JX#-3%`!$3`,!G$Eh9bD@9b!*!j0$!
+X"NGPEQ9fB3#313%d!6!"-6B"--),!M%"-!!d-#`)4'9XF'KTB@i!N$Jd-#`'4f9
+ZCACK!*!j!63"-!%h4$F"--),!M%"-!!d-#`*4A0`H5"6B@jc!*!h0$!X"NGPEQ9
+fB3#313%d!6!"-MBh-!%``JX#-3%`!$3`,!C0EfjKBfm!N$Sd-#`'4f9ZCACK!*!
+j!63"-!%d!6$##`)a!6!$-$!`16#3"M&#-*!(-J)b3J)`!M%i-J)b0M8#-N)#-!)
+a1$)#-MBe!c!`-%%`N!Ba4$#3"c)#1$-#0$J#-N4&!M)`0J)i-`)d1!)b4%8#-M!
+f!c!`-%)`N!Fe-*!(-J)``JF$-$!`3c#3"M%h-*!(-3)b4$L#JJ)c3d)#4MB"06J
+#08@#!6!$-$!`4M#3"M9$-*!)!M)e!6%#4%B#3cF#-!)d13)c0J)b363#-8Bd!M8
+i!M3i!MBe!M9&!6-#0%8a4MBd!M$""-)'JB'#JB(#"-%&`J2"")+#JB%"-3)``KF
+#,6-c-$Fc-d)e!M$#"!-`-$%c-*!'0d8`N!J"4!&"!6N"-8B"1!&$!88"-8-"-83
+"-88"-8B"0dB"-8)"-!!d0#`",3!!!5i!!!'Q!!!"`J!!!FB!!!'Q!!!"T3!!!D)
+!!!%Z!!!"*`!!!5)!!!(8!!!"e3!!!G)!!!(6!!!"b3!!!F!!!!&'N!5"J3%`!8D
+3")'"!6!$-$!a0$#3"M9"-*!)!M4&-83f3`)e!M%`-$%h!M&$!M$#"F%%!$*$,!#
+3#$%d1M!i!*!J45`!N!i$-$!a0$#3"M9&-*!)!M4&-83f0!)e!M%`-$%i!M*#!M$
+#!`)f!M$""!!b3b`!N!F'-6)[-M![-6)!N"e&,!#3$J-`-$%d-*!'0MJ`N!J#0%8
+a4$8i!M8#16!`-88#0J)`JJ)Y-8D3"6%c!M!#-3)``33!-N-X-3#3,%8X!*!1!c!
+`-63`N!Bf1$#3#!)d46&%06!#03)j-$!a43)f!M##!Lda4T!&-%B#-!)b!M$""!!
+b3b`b!*!X45`!N!i$-$!a0$#3"M9'-*!)!M4&-83h0!)e!M%`-$)c!M&%0!)``J-
+#-3)``33!-N-X!!)!!J#3+88X!*!1!c!`-63`N!Be4M#3#!)d46)`-%-#03)a-$!
+b-`)a4$3#--)$!M%#--%%!$*$,!!#!*!V45`!N!i$-$!a0$#3"M9'-*!)!M4&-89
+'3`)e!M%`-$)c!M&$0J)``J-#-3)``33!-N-X!!F!N#Y&,!#3$J-`-$%d-*!'08B
+`N!J#0%8a4$3`!M8#-6!`-M-#-8-f!M$#!`)a!M$""!!b3b`!!3!'!*!T45`!N!i
+$-$!a0$#3"M8j-*!)!M4&-83c1!)e!M%`-$%j!MF#--)&`33!-N-X-3#3,%8X!*!
+1!c!`-63`N!Be4$#3#!)d46&%-c!#03)a-$!a13)h!M$#!`)a!M$""!!b3b`c!*!
+X45`!N!i$-$!a0$#3"M9&-*!)!M4&-83b1!)e!M%`-$%j!M&%!M$#!`)b!M$""!!
+b3b`a)'pQ)$-!N#G&,!#3$J-`-$&'-*!'0cJ`N!J!$`!!!%J!5!#3"!,`!N$rmIr
+Z!`N#8Q-#"5J$r!%!!!!"D!&S!*!%$V!,3!!"!3!!C!!"!!!!!3!#!!!!!5F2!!%
+!N!i3!*!*%!$rYIqQ$bd,QJ!)!3#3$4N"-$3a36#3"M8i-*!)!*!%!C%#G!",!!)
+!N!m"!*!-"c%Z-$!JD@i(-5ic-#"TEJFa,M)b)'PZ"c%Z0$!JD@i!N!m34T!%-*!
+(0M!`-$%`-$&%!6Fh38%$-*!+0d3`N!8d-83#-6!`-83#-3)Y08Bh4MG&46!#1$#
+3"J)Y0$#3"`)`JJ)d1$!`0$J#,6)#1$-#1%B"-!%a-!%d1!%d-!)Y-B)#--)+!MJ
+c!M3i!MK'!M)`0J&'N!5"J3%`JS)#-3)d4$4%0$)d-J)`JJ)b3J)`!N8"0$J"-!-
+`-$!a-*!'-cN`N!Fa!M!#43%i0!)`!6%#-!%a!M!#1$-#0$J#1%B#-M!f!6#"!6-
+"1%8`-!%`!MJc!M3i!MK'!MK#!M!$-$!`-M#3"M%b-*!)!%8XB5"cE@&XE#"SC@&
+NCA)$-$!`0$#3"cN`N!Fb!M#"!M%`!6!$-$!`06#3"cN`N!Fb!M#"!M%`!6!$-$!
+`0M#3"M-b-*!(-3%``3-"13%c!6#"JS,""!&'N!5"J3%`!N-#3c#3"!)``JS#-J)
+``JI"))+#`31#!c!`-$F`N!Bi-c#3"c%"-)'"`Jc"")+"JJ)b!M$#"J)a-J%``3-
+"4T!%JB%"--)%`33"4T!%JB%"--%%JS+"!M)d!$3`,!#33!%`JB'#`31#!c!`-$J
+`N!Bj1$#3"c%!0$!X"94TE@9c!*!l0$!X"NGPEQ9fB3#313%d!6!"-63"--),!M%
+"-!-`-$!j-*!'-6N`N!Fb!M*#!M!#3c!#-MBe!M*#!M!#3c!#-MBe!c!`-%%`N!B
+a3M#3"c)#1$-#0$J#1%B#-M!f!MJc!M3i!MK'!M)`0J-`-$"#-*!(06#3"c)#--)
+(!c!`-%-`N!G&-*!(-3*&!M$#!i%#0$1#!6%$-$!`4M#3"M9"-*!)!M3`!6%#4%B
+#3cF#-!)d13)c0J)b363#-8Bd!M8i!M3i!MBe!M9&!6%#-),""-)'JB'#JB(#"!%
+c!6$"!m)$`35#JS'"!6%#--)A!Ldc-c!h-c0#03)``J3$-$!a-c#3"MG&-*!)!83
+"33%j!6&'!6J"3`&&!6&$!6&%!6&&!6&'!6G'!6&#!6!!0$3X!5d!!!%Z!!!"TJ!
+!!F)!!!('!!!"TJ!!!D8!!!'L!!!",J!!!5F!!!%L!!!"e!!!!G8!!!(5!!!"d`!
+!!FN!!!(!!!!"4T!%JB%"-!&'N!5"J3%`!dD3"$#3"cB`-$!a-$!a4!%h0d&"!c#
+3#MG%-*!&0$&&!M%`-$&%!M%#,69'0dBh488`!MJ`N!B#,6-`N!F#-))#0$J`-$3
+i!Ldb!MJc!MK'!6!"-6!"0$J"0$!#,6'#!M$##J)i-`)d1!)i4J)b-$B"4T!%JB%
+"-)+#!M%#0%3d4$3b0$)#-))#-N)#-!)i!63i!6!$-$!`-6#3"M-j-*!(-3)`!MJ
+"1$3#-!%a!M!"-3)`!MJc!M3i!MK'!M)`0J%`J3%c!6K&-$!"-!)i-`)d1!)i4J)
+f3`)`!c!`-$)`N!G$-*!)!$JXB5"QEfpdCA)$-$!`0$#3"cJ`N!Fb!M#"!N%"-!-
+`-$!e-*!(1$#3"c)#-)%#33%`!c!`-$B`N!Bc-M#3"c%"--%$!6N"-`%`JB+#`33
+"4T!%JB%"-!*$!N-`N!3#--)+!M)#--)(`5##JX%$JJ-`-$!h-*!'1$-`N!Fa!6#
+"JF)-`35#JB)#-J)``JB#-6)"--%$!8D3")'"!6$#"-%%!8D3")'"!6$"")+#J3)
+b0!!d-#`!N%!"-)'"JX%$JJ-`-$!i-*!'16J`N!Fa!$3`,!98D@ePF`#31c3`,!C
+(C@jPGQ%!N$N"0!%`!6%d!6$##`)a!6!$-$!`16#3"M%j-*!(-J)b3J)`!N-`!M)
+f03)b3J)`!N-`!M)f03-`-$""-*!'-8)`N!Fb!MJc!M3i!MK'!M)`0J)i-`)d1!)
+i4J)b-$B$-$!`3M#3"c8`N!Fb!M$#"`-`-$"$-*!(46#3"c%#1!)``J1"!M)dJJ%
+a!c!`-%B`N!Be36#3#!)d-!%a!N4'!N-h!M!#0$N#-cB#-N%d!M&'0!)e1!)d1!)
+f03)e43%a!M##`36#"S'"JS'"`J3"-J%``32#!m%%JS+"J3%a!M$#&`)Y-c-`0c-
+c3M8#--)%!c!`-6-`N!Bh46#3#!&%!8%"13%a4J%i!8-"43%a3`%a4!%a43%a4J%
+h4J%a3J%`!$3d,!%Y!!!",J!!!DB!!!(#!!!"aJ!!!DB!!!'P!!!"SJ!!!5i!!!%
+R!!!")J!!!G3!!!(9!!!"dJ!!!G-!!!(*!!!"`!!!!8D3")'"!6!"4T!%JB%"-!0
+'N!3`N!Ff-$!`-6!`-83"0cG"33-`N!Sh46#3"63a4J)a-$!a4!)a!Lde4MG'0d9
+&-!)i-*!'!Lda4T!&-6-#-))#0$J`-$3i!Ldb!MK'!MP#!6!"-6!"0$J"0$!#,6'
+#!M$##J)i4J)d1!)j3J)b-$B"4T!%JB%"-)+#!M%#0%3d4$3b0$)#-`)`!M*#!M!
+#3`%d1!%`!c!`-$%`N!Bc36#3"c%#-!*$!6Jd!M!"-3)`!6%#-!)i4J)d1!)j3J)
+b-$B"-J%`!6-"1$J`-!%`!MK'!M4&!MP#!MG%!M!$-$!`-M#3"M%`N!N!3baEA@%
+JCQp[G'j[G'8$-$!`0$#3"d-`N!Fc!M!"-3)bJ3*&!6)$-$!`06#3"cJ`N!Fb!M#
+"!N8"-!-`-$!f-*!'3c)`N!Fc!6)"-)'"!6N"-`%`JB+#`33"4T!%JB%"-!*$!N-
+`N!3#--)+!M%#--)(`5##JX%$JS%"-3%`!6N"-`%`J3)a-*!&!M$""!&'N!5"J3%
+`!N-#3c#3"!)``JS#-3)`JS)#0c8c-c3`!M##!M-#0%8b0d%i!6$"%`%j!6$"#S+
+#`31#`3-"13%c!6#"JS,""!&'N!5"J3%`!N-#3c#3"!)``JS#-3)`JS)#0c8c-c3
+`!M$#!m%JJS,"!i)$-$!`0c#3"MJc-*!(-3%`JB(#$-%%JS'#!M)#--)'!M%b!6$
+"!`&'N!5"J3%``J6""!&'N!5"J3%``35#JS%#-M3!0$!X!*"!!6#"JB,"!i)$-$!
+`1$#3"MNi-*!(-3!d-#`&9'PYCA-!N$Xd-#`'4f9ZCACK!*!j!63"-!%a0!%``JX
+#-3%`!c!`-$N`N!Ba16#3"c)#-N)#-!*$-!)b0M8#-N)#-!*$-!)b0M8$-$!`36#
+3"M&#-*!(-J)i4J)d1!)j3J)b-$B#1%B#0$J#18)#-M!f!c!`-%)`N!Fe-*!(-J)
+``JF$-$!`3c#3"dB`N!Fa!N-#--)$!6%#-ND#!6%$-$!`4M#3"M8c-*!)!M3`!6%
+#3M)#18%#-!)c13)c0J)b3c%#-M""!M3i`J-"-3)`JX%%`JD"JB+"JF)%!6%"--%
+$`J2"")+#JB%"-3)``KF#,6-c-%4&18-d!M$#"!-`-$%c-*!'0d8`N!J"4!&"!6N
+"-8B"1!&$!88"-8-"-83"-88"-8B"0dB"-8)"-!!d0#`",3!!!5i!!!'Q!!!"`J!
+!!FB!!!'Q!!!"T3!!!D)!!!%Z!!!"*`!!!5)!!!(8!!!"e3!!!G)!!!(6!!!"b3!
+!!F!!!!&'N!5"J3%`!8D3")'"!6!$-$!a0$#3"M8j-*!)!M4&-MG"1!)e!M%`-$&
+'!MB#--)&`33!-N-X-3#3,%8X!*!1!dD3"$#3"cB`-$!a-$!a4!%h0d&"!c#3#MG
+'-*!&0$&'!M%`-$&%!M%#,69'0dBh488`!MJ`N!B#,6&'N!8`4J)`JJ)d1$!`0$J
+#,6)#1%B#18)"-!%a-!%d1!%d-!)Y-B)#--)+!MK'!M3i!MP#!M)`0J&'N!5"J3%
+`JS)#-3)d4$4%0$)d-J)c!M!#-N)#-!)a-3%d1!%`!c!`-$%`N!Bc3M#3"c%#-!)
+a-3%i0!)`!6%#-!%a!M!#1%B#0$J#18)#-M!f!6)"-!%c!6Ji-$!"-!)i4J)d43)
+j3J)j13)`!c!`-$)`N!Ba0M#3#!!a-5aEAA0PBfpZC#"QEfpdEQpdC3-`-$!d-*!
+(4$#3"c-#-!%a!M+"!M%c!6)$-$!`06#3"cN`N!Fb!M#"!M%c!6!$-$!`0M#3"N-
+b-*!(-`%b!6#"J3%j!6-"-)'#JX%%!8D3")'"!6!#3`*$-*!%!M$##J)a!M$#"m%
+JJS,"!i+"!6%"-!%j!6-"-)%#-6#3"3)``33"4T!%JB%"-!*$!N-`N!3#--)+!M%
+#-)+#!MFe-c-d-!)`JJ)c!M4&-MFb-!%``4-"13%``3U#JX%$JX%$!6N"-`%`JB+
+#`33"4T!%JB%"-!*$!N-`N!3#--)+!M%#-)+#!MFe-c-d-!)``J2"))+#`31#!c!
+`-$F`N!Bi-c#3"c%"-)'"`Jc"")+"JJ)b!M$#"J)a-J%``3-"4T!%JB%"--)%`33
+"4T!%JB%"--%%JS+"!M)d!$3`,!#33!%`JB'#`31#!c!`-$J`N!Bj1$#3"c%!0$!
+X"94TE@9c!*!l0$!X"NGPEQ9fB3#313%d!6!"-63"--),!M%"-!-`-$!j-*!'-6N
+`N!Fb!M*#!M!#3c!#-MBe!M*#!M!#3c!#-MBe!c!`-%%`N!Ba3M#3"c)#1%B#0$J
+#18)#-M!f!MK'!M3i!MP#!M)`0J-`-$"#-*!(06#3"c)#--)(!c!`-%-`N!Ba-*!
+)-3)a-3)``J-"-3)d3S)"-3-`-$"'-*!'06-`N!J#0$!"-3*#-J)j33)`!M-j!M-
+f!M*$-3)b-%%#0$M#!`%a!M##`36#"S'"JS'"`J3"-3%``32#!m%%JS+"J3%a!M$
+#&`)Y-c-`4%8j3c3#--)%!c!`-6-`N!Bh46#3#!&%!8%"13%a4J%i!8-"43%a3`%
+a4!%a43%a4J%h4J%a3J%`!$3d,!%Y!!!",J!!!DB!!!(#!!!"aJ!!!DB!!!'P!!!
+"SJ!!!5i!!!%R!!!")J!!!G3!!!(9!!!"dJ!!!G-!!!(*!!!"`!!!!8D3")'"!6!
+"4T!%JB%"-!-`-$%d-*!'06N`N!J#0%8b0c)`!M8#-6!`-8B#0J)``JA""!!b3b`
+b!*!X45`!N!i$4NC'46#3"cB`-$!a-$!a4!%h0d&"!d!D!!!!:
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/MarinerWrite_3.5.hqx b/writerperfect/qa/unit/data/writer/libmwaw/pass/MarinerWrite_3.5.hqx
new file mode 100644
index 000000000..759f96828
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/MarinerWrite_3.5.hqx
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/MaxWrite_1.hqx b/writerperfect/qa/unit/data/writer/libmwaw/pass/MaxWrite_1.hqx
new file mode 100644
index 000000000..7d1777a0f
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/MaxWrite_1.hqx
@@ -0,0 +1,12 @@
+(This file must be converted with BinHex 4.0)
+:#8eKH&GbDA4P-3"09d0868&B9`%!N!3R!!!#4kY`9'9iG#"[CL"0BAKAFQPdC3e
+bC@3J)'0SD@0KCfmJ-63JF'pTER3JTTX!!!%!!!!"`!!!!-!!!!#(8dP8C90*9%`
+&!*!A#8eKH&GbDA4P-3)!!J"09d0868&B9`#3#J)!69G$9%e"@&F!N"M6B5e9!!!
+!*`!!!NF!N!h(*3&83N)eG(4bE`%!N"d#&#8"9&0358&38%`"!*!G!5FP!99YJ6C
+"8&"-!J#3'$`!#3!'!#1H-!!MRLbU9DT9!#1H*!!!!!%!!3!!!"%!!J!6!!-!&3!
+!!"B!"!!A!!!!(J!&!"m!!!!Srrm!!!"X!!3!%!!-!!%!N!X"!"!!$!!"!!!!$!#
+3"`%!%!!-!!%!!!!-rrm!N!8"!"!!$!!"!*!%rrm!N!8"!"!!$!#3"3crr`#3"3%
+!%J!1!*!&$[rr!*!($!!3!!`!%J!1!")!$J!!!3!!!!(!!!!!`!!!!)F!)jlm'i`
+!!!!F!&S!!P0dH@`!!!!D8h483J!!!#C-ENKP!!!!-J!"!*!()jc8!!%!$`!!!%!
+!)jeF!!%!(J!!!,!!)je8$NeKH&GbDA4P)&0dH@aP$NeKH&GbDA4P)&0dH@aP$Ne
+KH&GbDA4P)&0dH@aP10%!:
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/MicrosoftWord_1.0 b/writerperfect/qa/unit/data/writer/libmwaw/pass/MicrosoftWord_1.0
new file mode 100644
index 000000000..d737a3902
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/MicrosoftWord_1.0
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/MicrosoftWord_3.0 b/writerperfect/qa/unit/data/writer/libmwaw/pass/MicrosoftWord_3.0
new file mode 100644
index 000000000..c8f69db64
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/MicrosoftWord_3.0
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/MicrosoftWord_5.0 b/writerperfect/qa/unit/data/writer/libmwaw/pass/MicrosoftWord_5.0
new file mode 100644
index 000000000..24a37a876
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/MicrosoftWord_5.0
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/MicrosoftWorks_1.0 b/writerperfect/qa/unit/data/writer/libmwaw/pass/MicrosoftWorks_1.0
new file mode 100644
index 000000000..39a40cf5a
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/MicrosoftWorks_1.0
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/MicrosoftWorks_2.0 b/writerperfect/qa/unit/data/writer/libmwaw/pass/MicrosoftWorks_2.0
new file mode 100644
index 000000000..c8a60e704
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/MicrosoftWorks_2.0
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/MindWrite_2.1 b/writerperfect/qa/unit/data/writer/libmwaw/pass/MindWrite_2.1
new file mode 100644
index 000000000..d9b8687b2
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/MindWrite_2.1
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/More.hqx b/writerperfect/qa/unit/data/writer/libmwaw/pass/More.hqx
new file mode 100644
index 000000000..e2689751b
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/More.hqx
@@ -0,0 +1,123 @@
+(This file must be converted with BinHex 4.0)
+:%N%JFfPYF'aP)'e[FQ8JCQPXC3"06e)c68p5-J%!!!!G"`#3")2I!!C06e)c!)!
+!!!#!!!!!H!!!!2J!!!'d!!!#V!!!!+J!!"%@!!!"0J!!%N`!!!!S!!!5G!!!!!J
+!!"*m!!!!2!!!'SF!!!!N!!!5d`#3#J08!!!0`J!!%VJ!!!!A!*!G$`!!!%J!5!#
+3"!,`!N$rmIrZ!`N#8Q-#"5J$r!%!!!!"D!&S!*!%$V!,3!!"!3!!C!!"!!!!!3!
+#!!!!!5F2!!%!N!i3!*!*%!$rYIqQ$bd,QJ!)!*!1'3%&S!@J"D!&S!%"!Y!$j`2
+R!!!!!`!"!!!!!`!-!3%!$!#3"!(J!S!!*!!N!E`#A!#3#3%!!!%!!!%!!J!"!3!
+"!2q3"!!$!!%!!`#3"!%"!!%!N!8"!!(rN!EGD`M#"U,rrJ!#!!%!!!!"!!)!!!!
+#!!%!!3)!!JX#U2q3'!%!!3!!!3%"!!)!!3!"!!)Y!!!"!!%!!!2R!!!$j`!!!qI
+rr`!-!*!-%!#3#!%!!3%"!!!K`!!"!!B(+'0[ER3Z+3#3#3%"!*!%)GeV#-)'SJ#
+3"[q3$!#3"[q3"J#3"[q3$!#3F`%!N!8&!!Arr`!'!#N!!`(8!Jd!N!N8!!!"i!+
+!!!J!"!!p!$d!!!!"rj!%!D`##`#3$3%!!!!4!!!!%!!!!!%!!`!(##!!!!"dqZJ
+!G3J"!'S6'!!!#)3!#3!%!!!!G3"q,e3!G2VS!(5`U!!"3YB!!88%3)(A-!"U%[J
+!DK,B!"!!#!!)!!-&2!!$"6a$lRi!!!3!$`!!!!J!"!#3"bN!!3!!!3J!!!2r!!!
+!(`#3#3%cN!B!!P@3"J!$Ij!'!!5CN!B!"EZ3"J!'hC!'!!IrN!B!#2`!mhd&,`!
+*mYF)9S6X!!VGD`M#"U)!#`*"Ue6Ur`!-!!#!!"'`!!d!N!68!!!1Irm!!(rr!!p
+rrcrr!!!!%2rrrrf!!!!4rrq!!2rp!",rri!!J!!!%i!!rj!%!"5!!IrrJ!!!&B!
+!J!,rr`!@!!#!!)!!!"F!!'CQQCN!'2rrc*!%!"R-N!B!'Xc-QC!%!"[-c*QCCQB
+!(-c-CQBc-`!Gc*!%QCN!(TQ3"'CQ!"pQN!3c-`!#!!!!(%*"3dY39&*1rj!)!*!
+0!J!!!"a#380,8&456P@r9Ip9reAr2rirrMrq2rirrMrq!!)!!!!F3N&$5e"88Nj
+9ZeAU9Ep9VPrpAreIr9rpAreIr3!#!!!!(%*"3dY39&*19DT9UP@U9DTrrhrrIrp
+rrhrrIrm!!J!!!"a#380,8&456P8L9BK9!P@)RrZIqjrlRrZIqjrl!!)!!!!F3N&
+$5e"88NkU!+S!UJ#U%,rk[rUrqVrk[rUrqJ!#!!!!(%*"3dY39&*1L!!J!)J!)J$
+IqYrkhrVIqYrkhrS!!J!!!"a#380,8&456J#3#2q3$!!#!!!!(%*"3dY39&*1L!!
+L!+J!)J$m!20p"5rm!20p"5m!!J!!!"a#380,8&456P@r9Hj9qeAZmYF)9S6XmYF
+)9S6X!!)!!!!F3N&$5e"88NjhhAIGGpehhGeV#-)'SYeV#-)'SJ!#!!!!(%*"3dY
+39&*19D*9+P@U95S#3DY8k[m#3DY8k[m!!J!!!"a#380,8&456P@r9Hj9qeAZ!!#
+!!"'`!!#!!"'`!!)!!!!F3N&$5e"88NjhrphrGrrGr`#3"03!N!A8!!!#!!!!(%*
+"3dY39&*19DT9UP@U9DS!N!ErN!B!!J!!!"a#380,8&456L+))SJLL#+)!*!'rj!
+'!!)!!!!F3N&$5e"88Nk)!#!!J!3!!2rrrrf!!2rrrrf!!!!#!!!!(%*"3dY39&*
+195"9!&8L93$rri!!rrhrri!!rrd!!J!!!"a#380,8&456P8L9BK9!P@)rrq!!)!
+!rrq!!)!!!!)!!!!F3N&$5e"88Nk)!#!!L!!L!)!!rj!%J!$rN!3!!J!!!"a#380
+,8&456US!)J#U!#S!J!(rri!!J!(rri!!!!)!!!!F3N&$5e"88Nj9)P@+95*9US!
+!J!,rri!!J!,rr`!#!!!!(%*"3dY39&*19EY9kP@r9Di!!)!!J!!!!)!!J!!!!J!
+!!"a#380,8&456P@l9Ip9[eArIrmrr`!!Irmrr`!!!!)!!!$f!!%!!!!F!!!!6J#
+3"2rr!*!&!T!&IJ#3"B!%!*!&#!!)!*!*5!!!!%J!N!8%!!%!"!#3"fi!N!34%4%
+!%!!!)"!!!#!3!!!J%!!!)"!!!#!#)L)J!*!,$`!!0#9'(2rr!!'$!)eQrrm!!J'
+4#CfIr`!$!*!("!#3"`8!N!F'!*!("`#3"`J!N!F*!*!(#J#3"`X!N!F-!*!($3#
+3"`i!N!F2!*!(!J!!!2B!!3!!!"`!!!"1!*!%rrm!N!8#N!9q!*!&J!3!N!8)!!J
+!N!P)!!!!5!#3"33!!3!%!*!(EJ#3""%4%3!3!!!J%!!!)"!!!#!3!!!J%!!!)!)
+L)L!!N!X2!!$[r`!"!!%!!HrrC(KYS3!#Rrm!!3!"!!-!N!F%!*!("3#3"`B!N!F
+(!*!(#!#3"`N!N!F+!*!(#`#3"``!N!F0!*!($J#3"`m!N!F#!!!!pJ!"!!!!(!!
+!!%i!N!6rr`#3"3+3"Ai!N!@!"!#3"3J!#!#3#8J!!!")!*!&"!!"!!3!N!GZ!*!
+%%4%4!"!!!#!3!!!J%!!!)"!!!#!3!!!J!L)L)!#3#`m!!+!!S!#J!!!"hrrIrpr
+r!!*3!&!!8!!!!`#3"`3!N!F&!*!("J#3"`F!N!F)!*!(#3#3"`S!N!F,!*!($!#
+3"`d!N!F1!*!($`#3"`)!!!$f!!%!!!!F!!!!6J#3"2rr!*!&!T!&IJ#3"B!%!*!
+&#!!)!*!*5!!!!%J!N!8%!!%!"!#3"fi!N!34%4%!%!!!)"!!!#!3!!!J%!!!)"!
+!!#!#)L)J!*!,$`!!rrq!!)!!!!(rrlJTYEB!!VrrB!"J!!!$!*!("!#3"`8!N!F
+'!*!("`#3"`J!N!F*!*!(#J#3"`X!N!F-!*!($3#3"`i!N!F2!*!(!J!!!2B!!3!
+!!"`!!!"1!*!%rrm!N!Vr!*!&J!3!N!8)!!J!N!P)!!!!5!#3"33!!3!%!*!(EJ#
+3""'3"!#3&#+3"!#3#`m!!$3P4Kcrr`!"J`#0C[rr!!)"N3QGRrm!!`#3"`3!N!F
+&!*!("J#3"`F!N!F)!*!(#3#3"`S!N!F,!*!($!#3"`d!N!F1!*!($`#3"`)!!!$
+f!!%!!!!F!!!!6J#3"2rr!*!+r`#3"B!%!*!&#!!)!*!*5!!!!%J!N!8%!!%!"!#
+3"fi!N!34N!3!N"3LN!3!N!X2!!$rr`#3"3([rf4iED%!!Trr!!%!!3!$!*!("!#
+3"`8!N!F'!*!("`#3"`J!N!F*!*!(#J#3"`X!N!F-!*!($3#3"`i!N!F2!*!(!J!
+!!2B!!3!!!"`!!!"1!*!%rrm!N!Vr!*!&J!3!N!8)!!J!N!P)!!!!5!#3"33!!3!
+%!*!(EJ#3""'3"!#3&#+3"!#3#`m!!+!!S!#J!!!"hrrIrprr!!*3!&!!8!!!!`#
+3"`3!N!F&!*!("J#3"`F!N!F)!*!(#3#3"`S!N!F,!*!($!#3"`d!N!F1!*!($`#
+3"`)!!!$f!!%!!!!F!!!!6J#3"2rr!*!+r`#3"B!%!*!&#!!)!*!*5!!!!%J!N!8
+%!!%!"!#3"fi!N!34N!3!N"3LN!3!N!X2!!$rri!!J!!!!IrrZ#QeYJ!#[rpJ!'!
+!!!-!N!F%!*!("3#3"`B!N!F(!*!(#!#3"`N!N!F+!*!(#`#3"``!N!F0!*!($J#
+3"`m!N!F#!!!!,N*"3dY6584&!J#3#3(d!I3!N!3$k!2S!!%!)!#3"`%!"Irr!!)
+!!!!Z3N&$5e0*4%8#!*!*!I3"p!#3"!2S!qJ!!3!J!*!'h@X)`JDL!!)!!!!Z3N&
+$5e0*4%8#!*!*!I3"p!#3"!2S!qJ!!J!Jrrq!!2rpJ!#!![rr!!)!!!!Z3N&$5e0
+*4%8'!*!+%J%R!")"*`"R!Ad!"3!J!!"QCTQCJ!$rN!3!!J!!!#j#380,8dP%43%
+!N!N"p!(d!*!%!qJ$k!!&!#!!!)!!%E"jRIrrB6-!!J!!!#j#380,8dP%433!N!N
+"p!(d!*!%!qJ$k!!"!#"rN!ErN!B!!J!!!#j#380,8dP%43)!N!N"p!(d!*!%!qJ
+$k!!"!#$GD`M#"U,m!20p"5m!!J!!!#j#380,8dP%43F!N!TR!9)!%J%R!'F"I3!
+#!#!!N!68!-NfcrMrN!3!J3!!%ZX!!IrrJ)%!!"-2!!(rri#"!!!6-`!"rrqJJ3!
+!&h3!!3!!`!N!!"R`!!%!!8!*!!!Fm3!"!!(!#3!!'PX!!3!"`!N!!"Tp!!%!!8!
+*!!!DU`!"!!(!#3!!'aF!!3!"`!N!!"Y1!!%!!F!*!!!EFJ!"!!(!#3!!'j3!!3!
+"`!N!!"Zf!!%!!F!*!!!Ee`!"!!&!'3!!'pm!!3!"3#%!!!!"!!%!!F!*!!!F"3!
+"!!(!#3!!($%!!3!"`)N!!"ab!!%!!N!C!!!FK!!"!!*!'3!!(*3!!3!$3!N!!"b
+F!!%!!N!C!!!FV!!"!!&!#3!!(,`!!3!"3!N!!"c-!!%!!8!*!!!Ff`!"!!*!)3!
+!!!%!!3!#3#%!!!!#!!%!!N!K!!!!!`!"!!*!)3!!!!3!!3!!%ZF!"2rr!!!5l`!
+%rrm!!"-6!!6rr`!!%cF!"2rr!!!F63!'c-`!!"08rrm!N!35m`!!%aF!!"8H!!!
+AI3!!'L-!!"TP!!!Dr`!!'cB!!"YD!!!EI!!!'ji!!"Zr!!!El3!!("N!!"aD"NG
+PEQ9fBB!!!`P)C@afCA4TBf%!&3"K!"8!CA4TBf%!&3#3"!%!!"caIrrM$J#3$aJ
+!$!!"$")!!!2R$`IrpJ#3"33!!2d`!*!,'!!-!!%-%J!!!qF2"rrf!*!&"!!!r6!
+!N!FC9'KTFb"TFb"K)(0KEA"XC5"MEfeYC@jd,J!!!FB!N!9Mlq3""!!!!'B!!!!
+&!(!!!!"+!"N!Bqr`!'2`!*!&`cJ!N"%"!cLK!D%"S!'J!3#3"3)!"3!"!!%!!J#
+3"!&S!@J@J"D!!!B!!!"a!!!!5J"`!!!!5J!B!'2[p!"Mlq3!N!6$1!#3%3%$1+%
+"S3'J!D!"!*!&!J!&!!%!!3!#!*!%!@J"D"D!&S!!"J!!!(%!!!"+!(!!!!"+!"F
+!Bqri!'2[m!#3"--i!*!4!3-iS3'K!D!"S!%!N!8#!!8!!3!"!!)!N!3"D!&S&S!
+@J!!'!!!!F3!!!%S!F!!!!%S!&J"Mm!!!Bqrd!*!%`aJ!N"%1!aLK!D%"S!'J!3#
+3"3)!"3!"!!%!!J#3"!&S!@J@J"D!!!B!!!"a!!!!5J"`!!!!5J!9!'2[j!"MlrJ
+!N!6$1!#3%3%$1+%"S3'J!D!"!*!&!J!&!!%!!3!#!*!%!@J"D"D!&S!!"J!!!(%
+!!!"+!'F!!!!&!!!#8J!-!"m-*`!!!qF$!B!#!*!&#J`K!!!$j`3#!"J!N!B-)J!
+"!qF%!J!5!*!'$#F!!!2R$!m!N!J-)3!!!qF3"J!"!*!'$#)!!32R'3X!"3#3"J`
+K!!!$jaN,!*!)$#F!!!2R+43!N!8+!"`-)!!!!qFV&Irr!!!!*J!!$#F!!!2R,"B
+!!J#3"J`R!!!$jc-C!!%!!!!Q!"`-)!!!!qFd'J!'!*!'$#F!!!2R1"X!"3#3"J`
+R!!!$jcXF!!)!!!"#!"`-)!!!!qFm(3!"!!B!N!3-)!!!!qG!(`!#!*!'$#)!!!2
+R3L!!!3#3"J`J!!!$jd3K!3#3"``J!!!$jdBL!!!!$`#3"!`J!!!$jdJN!3#3"``
+J!!!$jdSP!3#3"``J!!!$jd`Q!3#3"``J!!!$jdiR!3#3"``J!!!$je!S!3#3"``
+J!!!$je)T!*!)$#!!!!2R9#S"!*!($#F!!!2R9LX"D!&S!*!%$#F!!!2R@#b@J!#
+3"J`R!!!$jeSYPS!!N!B-*`!!!qGF,J#3#!`R!!!$jei[!*!)#8KPE(CPG'PMB8*
+"3dY39&*1!*!)rj!-3N&$5e"88NlrN!J!N!a#380,8&456P@U9DT9UP@UIrprrhr
+rIrprrhrr!!!!"94TG'aP!!!#E`!-!"m-%`!!!qF$!B!"!!!!"!!($"-!!!2R"!)
+!$!#3"J`4!!!!!3B$!!%!N!B-%`!!!qF'!`#3#!`6!!!$j`J%!*!)$"-!!!2R#J8
+3!*!($"-!!!2R$!m!N!J-%`!!!qF2"`#3"`3-%`!!!qF3"J#3#!a$!!!$ja!'!!%
+!N!B-%`!!!qF5#!#3#!`4!!!$ja3*!E!!N!B-%J!!!qF8#3#3#!`6!!!$jaB+!*!
+)$"%!!!2R'3X!!3#3"Ja$!!!$jf!`!*!)$%-!!!2RBM%!N!J-3`!!!qGP-[rf!!!
+!#`!F$%!!!!2RD66rr`!!!#F!!!a$!!!$jfSe!*!)$%-!!!2RE$B!!J#3"Ja$!!!
+$jfir!*!)$%-!!!2RF6IrpJ!!!#F!(!a$!!!$jh)i!!%!N!B-3`!!!qGd13!#!*!
+'$%-!!!2RGcVrpJ!!!%-!(!a$!!!$jhJl!!8!N!B-3`!!!qGl22rf!!!!A`!F$%-
+!N!4m23@J#(!!N!3-3`!"!qGm233i"`J!N!3-3`!!!qGq2J$F!0`!N!B#d!C(C@j
+PGQ&#380,8&456J#3#2q3$%*"3dY39&*1rj!)!*!-3N&$5e"88NlrN!J!N!a#380
+,8&456P@U9DT9UP@UIrprrhrrIrprrhrr!!!!%N%JFfPYF'aP)'e[FQ8JCQPXC3!
+!!"PLBA0TBb!S)'*[E'3J1L"RC@jPGQ%J-6)T!!!!0!!-!!--%3#3"!B$!!)!N!B
+-%3#3"!B$!!%!N!B-%3#3"!B$!*!,"QPdB@aTB`!!!"3!$!!"$"%!N!3'!`#3#`C
+ZEh*YB@`!!!!%!!!5c`!!!"J!!"S'!!!!(3!!'Zi!!!!4!!!G"hrri[J!!!!r)"Y
+2Eh9dE'PZC5!E8aY[FfKKC'ph)"Yc'dacG@*cBh*TF(3E3A0eF'9bFf0bDA"d'e8
+EBA9ZC'9bE'PZC4YeFh9`CA)E6(0eBR-EB4YL'h8!!!!8!!`!!3`4!*!%#!6m!20
+p"5m!N!8EH@9XE'ph)"Xi!!i#3DY8k[m!$KXiBQaeC4X[!!!!&!!-!!%-%3#3"!S
+&'!#3#JJa,M8JE'PZC3!!!"3!$!!"$"%!N!3+"5!!N!S'-L"XD@jP!!!!&!!-!!%
+-%3#3""!'!!%!N!N'Bf9ZG'9b!!!!&!!-!!%-%3#3""!'!!)!N!N&FQPRD(3!!!!
+8!!`!!3`4!*!%%!B!!`#3#34QG@aX!!!!#Q0XEfjP)(4PFh3!!!!8!!`!!3`4!*!
+%$!m%X!#3#4"QDA*cG#"YBA*RD@iJ-5ic!!!!&!!-!!%-%3#3""3*"N!!N!NBE'9
+QG#!V)'CTFR0d)'eKFQGTER-J-5ic!!!!#@%JBfpYE@9ZG!!!!"3!$!!"$"%!N!3
+@#J+S!*!*$R*TCfKd)'eKFQGTEL!f!!!!$'aPGQ9X)$)JC'&dB3!!!!4cB@eP!!!
+!$'aPGQ9X)$-JC'&dB3!!!!aXCACPE#!b)'4KG'%!!!!-E'9fC@`J-5"NBA4K!!!
+!#fGKG'KPFL"dCA0d!!!!%QGKG'KPFQ9N)'KPB@4XD@jPF`!!!"*LBA0TBb!S)'G
+PEQ9fB5!a-LRJ5`!!:
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/MouseWrite_1.hqx b/writerperfect/qa/unit/data/writer/libmwaw/pass/MouseWrite_1.hqx
new file mode 100644
index 000000000..dd4c9e7e5
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/MouseWrite_1.hqx
@@ -0,0 +1,58 @@
+(This file must be converted with BinHex 4.0)
+:"@e[GA0P!%GQ6A4(66!a!3!!!!Y)!*!%a0m%4dd`0!#3")!!!!LS!!!"-!!!!(J
+!!!"D!*!(#3"p!-!!M`!+!!!!`!#P!!S"I3$!!+S!#J&p!!!!Y`!-!Ad!!!$!!!i
+"I3!!!-d!$J&p+YF!dJ!1!Ad!$J$D!!i#I3!1!1!!$J&p!!!!iJ!*!(d!`!L"!!i
+"I3!!#*%!$K&p!!!)TJ!1!Ad!!!LR!!S!!!$!#+J!N!F%!H!5!3!-!!%!qJ#3&!%
+!N!B%!H!5!3!1!!!!qJ#3'Bm!"!(J$`%!$!!!!+B!N"3"!*!%`!!%!H!2!3!-!!%
+!TJ#3&!%!N!6L!!3"i")"!!d!!!#Q!*!8!3!!!!L"!"F"i!m(!!X!!!#Q!AF"UJ(
+&!GB"eJ(@!*!("!%!!!!)N3!%!H!5!3!-!!!!qJ#3&!%!!!!)T`#3*!LS!!m!!!"
+)!%J!N!3#m!*!rr(rlJ-*!P*M!J8S!r`"!!!!!@J"D!#3"!k`#d!!!3%!!'3!!3!
+!!!%!!J!!!!%R$`!"!*!1%!#3#4!!rlArTJmY#jS!#!%!N!dC!3!5!"N"!3"Lhk3
+!BXk!!!!!#!!!!!ErN!J!iJ!*!(d!`!$!!!i"I3!!#)%"`J(B!!3!+`$1!-i!h3!
+%!$J"!IrrrrIrrrrhD'9KC'9b)$*QEfpdCA)!K[q3"!"P!,S!%3,r$!$rN!B!!2r
+r!!!!ZJ!!!'8!N!HK!'3!#'43FQm!!!!"!+!!JJ!Drj!'!!%!#[q3"!"P!,S!#3#
+3#6%!!3!S!'8!IJ!D!*!(#Iq3#!!i!#!!3J!"!#X!Z3#J!)-!rj!&!'8!ZJeTGh"
+iGb`0C@jRE'PcD#"MC@jdCA)0BQpXC!eMD'PMB@G[)'*[E'30-6)JF'pTER30-63
+JF'pTER3JE'9QG%&bD@&XBQp[DfeKFQYTG'&XD@-0$3H@!#d!4`$D!434!D!!JJ%
+!#J#3"!,3!N#B!"`!,3"!!0S"'!!Y!%F!fJ%8!#d!4`$D!43!!!,P!!,P!!,P!!,
+P!!,P!!,P!!,P!!,P!!,P!!,P!!,P!!,P!!,P!!Eh!!"im!!'p`!!L2!!"rJ!!3-
+)m!!(q!!""!6`!!Ii!!%B"2!!%[i!!JIrJ2i!!@!%q3!"$r$k!"2q!!)%!(cq!!'
+!"2S!!Jr`)2S!&2i!"`3!!r`!!3!%q`!$!I!!32S!&2i!"`3!!!2r!J!#q`!$2J!
+!J2S!%[i!!!6q!!!$qIm%mm!!!)$k!"(q!!!%rJ!!$rRr!r`!!!(j!"(q!!!%rJ!
+!(rRr!ri!!!,j!"$q!!!%rJ!!2rMr!J!!"2N!%2i!!!6q!!"rq2m#J!!Bq3!3rJ!
+!"2i!!(rir`+!!#$j!!lq!!!%rJ$hr`,!!%$j!!lq!!!%rJ$hr`,!!B$j!!hq!!!
+%rJ$hr`(!![J!$Ii!!!Mq!2Ir!F!%q!!0rJ!!#2i!prm"`!Mi!!hq!!!)rJ$hr`(
+!%2J!$Ii!!!Mq!2Ir!IJJq!!1rJ!$#!!!!IIr!FI!q!!1rJ!$#!!!![Ir!F#qq!!
+2rJ!$#!!!"2Ir!X%"m2N!%2i!!`J!!!Mhr`2"!!q!qJ!3rJ!$#!!!%2Ir!m)!!(M
+k!"$q!!-)!!!Jprm$a!!!"rS!%Ii!!`J!!%$hr`$)rJ!!m2X!%[i!!`J!!)$hr`$
+3rJ!"$i$m!"(q!!-)!!%!prm!i2d!!(Mm!"(q!!-)!!)!prm!`2d!!'$m!"(q!!)
+)!!Ifr`$!rJ!"!i$m!"(q!!-)!!J!prm!`2i!!"cl!"(q!!-)!"J!prm!`2i!!'$
+l!"$q!!-)!"!!p[m$q!!$J2X!%2i!!`J!%!$hr`2!"r!-qJ!3rJ!$"!!J!2Ir!m!
+!$$$k!"$q!!-%!#!!prm$`!!$32S!%2i!!`3!B!$hr`2!!!$JqJ!3rJ!$"!"J!2I
+r!m!!!aMk!"$q!!-%!'!!prm$`!!%"[S!%2i!!`)!3!$hr`2!!"J"qJ!3rJ!$!J"
+!!2Ir!m!!)!(k!"(q!!-#!%!!prm%`!"!!)$l!!lq!!-#!%!!p2m"J)$l!"(q!!-
+"!%!!prm%`!)!F%$l!"(q!!-"!%!!prm%`!3!$N$l!"$p!!+!3!$hr`6!'!!"i2X
+!%2d!!S"!!2Ir"-!J!!!mq`!4r3!#3%!!prm&`-!!!"1!r!!4r3!#)%!!prm!`Ii
+!!4"!r!!4r3!#)'!!prm!`[i!!4!Jr!!4r3!#%'!!prm!c2i!!4!Br!!4r3!#%'!
+!prm!d2i!!4!%r!!4r3!##&!!prm!i2i!!4!$r!!4r3!#"%J!prm!`2i!!4!"r!!
+3r3!"!Nrfr`$!rJ!"%!(m!"(p!!)"3!$hr`$!rJ!"%!(m!"$m!!(!!2Ir!-$q!!%
+3!I`!%2`!!8!!prm!`2i!!4!"r!!3r!!"B!$hr`$!rJ!"%!,m!"$m!!&3!2Ir!-$
+q!!%3(2`!%2`!!8J!prm!`2i!!4$Jr!!2r!!"4J$hr`$!rJ!!)rX!$r`!!8%!prm
+!`2i!!#cl!!rm!!&!J2Ir!-$q!!"`q`!2r!!"3'$hr`6!!!!"S2X!$r`!!8!Fprm
+%`!!!!L$l!!rm!!&!!rIr"-!!!!`Jq`!2r!!"3!$hr`6!!!!3)2X!$2`!!8!!p2m
+"i%$l!!rm!!%J!2Ir"-!!!*a!q`!2r!!"%!$hr`6!!!-$`2X!$I`!!3J!prm#`!!
+%q3!0r!!""!$hr`,!!!Mj!!hm!!%#!2Ir!X!!%2N!$I`!!3)!prm#`!!Jq3!0r!!
+"!3$hr`,!!%$j!!cl!!#!prm#`!'!q3!-q`!"3(rir`'!![J!$2X!!8"rq2m"J!6
+i!!cl!!%J2rMr!3!)q!!0q`!"%"rjr`,q!"$i!!hl!!%)$rRr![`!B2J!$IX!!33
+$qIm#m!#!q!!2q`!!"2`!!3*!rJ!!!IF!$rX!!!,m!!%#J2i!!!,h!!ll!!!"r!!
+!!rd!!!6h!!lk!!#!r3!!![d!!!Mh!!lk!!"!r3!!"[d!!"$h!!lk!!!Jr3!!#[d
+!!#$h!!lk!!!3r3!!-[d!!#$h!!lk!!!-r3!!`[d!!%$h!!rk!!8$J!!!"`,p!!#
+!p`!1q3!%B!!!'!,q!!!"pJ!1q3!%(!!!B!,q!!!#pJ!1q3!%!q!$J!,q!!!%pJ!
+0q!!$(``!![i!!!Mf!!ch!!,`!!,q!!!3pJ!+p3!!![i!!#$f!!Ve!!!#rJ!!32B
+!#[8!!!,q!!#!pJ!*p3!$!J!!!I8!#I8!!`)!!!,e!!Re!!-#!!!%p3!*p3!$!3!
+!#28!#I8!!`%!!"$e!!Re!!-"!!"Jp3!)p!!#J!H!p3!(p!!"i(Md!!Id!!%IJ23
+!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8
+!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8
+!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8!!Z8
+!S!#$r`!Y!%F!fJ%8$3dG$GF0F'&RC5"LFQ9KD`eZCAFJFR9XC3eK$@)0e`e`B@G
+P)$-0$F+Q!!!!:
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/NisusWriter_4.0.hqx b/writerperfect/qa/unit/data/writer/libmwaw/pass/NisusWriter_4.0.hqx
new file mode 100644
index 000000000..f1420d79e
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/NisusWriter_4.0.hqx
@@ -0,0 +1,206 @@
+(This file must be converted with BinHex 4.0)
+:"A4PFh3d!&4&@&41590*!3!!!!+r!!!le9ieB5"cE@&XE#"dCA0d$3eZEh*YB@`
+JBQpXC#"TG'&XD@-JG@jNCA*XD@jP)(0eF'9bFf0bDA"d)(0eBR0MFQP`G#"[GA4
+XD@jP)(0SB@4[Gb"MEfjNC@jcC@3J$@9iG'9ZC'9N)'a[Gf9bG@jNCA*XD@jP)'4
+[G(4PC(9ZC'9bE'PZC5"hEh*NG@jNCA*XD@jP)(0eF'9bFf0bDA"d-L"cG@*cBh*
+TF(3b$A0dFQPVCA4SFQpeCfJJ6hCPFQ*KFL"TERCPFR3J38a-3d&38b"cE@&XE'0
+KF(-JBQpi)!eLE'&MDb"bC@3JCh*PC@iJBQaeC5"MH@&Z)'eKCf9ZG'%JH@9XE'p
+h)(GSDA4P)!eTERCTFfPLE'8J)(*PGQ9bFf8JEQpcF'9XE'PZCb!0$A4KBR-JG'9
+cG$SJE'9QG#!a,M)e)'0PER4PFL!a,M8JFQPRD(3J-5ih05"NC@0TE@&X)$)JDR9
+cG'PQH5!b,M)e$3Q3"$)Z-JPKN!F0-Lie)'aPB@4PFLiZ,L!b,MFe)'aPB@4PFLd
+Y,5!c)'aPB@4PFL"IAemJ-bie)'aPB@4PFL"KB@%0#C!*$@aPCR3J-5ib05`JCQP
+bFh3J-5"dB@)J-5ib$@CTFR0d)$%Z-cFJE'9QG#!a,M)e$@PNC@dJE'9QG#!f$@j
+[FQeKE!eMC@jdCA)0FQPRD(30CR9XE!ecF'&MD@jR)'j[FQeKE#"LC@C[FQ8J-6!
+0Fh"KBfPZCb"LC@C[FQ8J-5ia+#"KEQ3JB5"RFQ&`D#N0G'PYC5"QD@9XC#!k)"3
+0$@*PCLJJB5"YBA*VCA)J)b-J6NmJ9%9B9#"*6L"039*,49)k)0*K)'jPGb"YBA*
+Vdb!M)fpbC5!`$@Jp-6-Z-3eS26%c,M%J+'CTH'9N+3eS25!b)#KXD@jP+3d"$3f
+Jc!!!!3!!!$QI!!!iR`!!!MB!!!!9!'!CKJ!J+98!)%("!#!(!*!%&J!-'DB!"%'
+p"A4PFh3d!J!#!&4&@&41590*!3$rN!3!N!3%D`!!!J"849K86NP653%!rj!%!*!
+5c'2%"J!!!Vm!!$[9!*!)"rm!!!6b!!G8-`!"!*"a33-!J!!!!!-c,M!f6QPcGA1
+S)$-Z-#"'D@aP)%C[FQeKG!fT8'&bB@G[EL"$EfjMCA"dFb`J5@jM,L!a16Ji,6N
+f!!!!-J38J!!!!!8d,M%Z0#8d,M%Z0!fT8'&bB@G[EL"$EfjMCA"dFb`J5@jM,L!
+a16Ji,6Nf!!!!S*p8D'Pc)'4[Bh9YC@jd)'0[G@aN)'j[G#"LC5"[F'9ZC@3JBQ9
+MBA9cC5"dD'8JBA"`E'PMBA4TEfiJdNjTFh9cdb"MEh9XC#"ZEh3JBQ8JCQpeEQ3
+Z)#"8Eb"[FQ4PFL"K)'0[F(NJEfBJ6QPcGA-X)'0[ER4KBh3J6QPcGA-J8fpQG(G
+KFQ8X)%PZBbiJBA3J+$Ba15Nd1$%Y-63h0bi!!!!L!#!!N!F#!!-!N!F-!*!4AJ"
+H!!d![!#D!B-!%3,r$!$rN!3![!!!!!d!!!'$!!!!QJ#3"k!!JJ#K!'3!#%j*8dN
+!"3!+!!%!#J!0!,`!QJ'$!!X!(J!H!%)!$3#m!*S"J`")!+!!J`$r!!!!9J"@!!)
+!3!#2!2J!%3,r$!$rN!3!3!!!!!)!!!$i!!!!M`#3"k!!JJ#K!'3!#%j*8dN!"3!
++!!%!#J!#!%!!M`$i!#!!!J"!!)i!p`#J!)-!r`!!#Q`+E!#3"E3"@`!4![m-!2q
+3"!#3#!&E!!!!Y!#3"k%"mJ!@9(PME`#3"l3"@dGbLA"SVf*U!+%!C!FN!*!%9(P
+MD'q[BQS!N!3($J!!#0`khe"0-$%!!!!)!%J!5!")!%K38M!a!!!!H!!2!!!!5!"
+)!*!%![!#32rarqi$#3*5B`)&+!2m!3!!!!&S!@J!N!31X!Y!!!%"!!"N!!%!!!!
+"!!)!!!!"*`m!!3#3$K!!N!N3!2qerkB2,3ZD!!J"!*!0'3&88M!a!!!!@J!!!!3
+!"!!!`"%2r`!c!$J!5!&E!,3!!3!"!!%!!3"(T0J!4k2i!%HMp!!@!"-!3J!!!"B
+!!!"(Sr`!4k1!!*!&4k2)!*!&4k28!*!&4k2X!%HM[&96-$%!N!4%8c!b!!!#fJ!
+!!3%!"!!!!3%!"!!$!!!!$!!"!3#3#!%!!!!$!!-!!`!$!3C(C@jPGQ%!N$m$!!!
+!$!!#!3#3"!%!!!!"!!!!!`!$!!-!!`%'4f9ZCACK!*!r!`!!!!`!!J%!N!3"!!!
+!!3!!!!-!!`!$!!-""NGPEQ9fB3#32`-!!!!-!!)"!*!%!3!!!!%!!!!$!!-!!`!
+$!3C(C@jPGQ%!N$d%!!-!!!!+!!%"!*!%!3!"!!%!!!!$!!-!!`!$!3C(C@jPGQ%
+!N$d%!!-!!!!-!!)"!*!%!J!!!!%!!!!$!!-!!`!$!!C(C@jPGQ%!N$m$!!!!$!!
+#!3#3"!)!!!!"!!!!!`!$!!-!!`!'4f9ZCACK!*!r!3!"!!%!!3!"!!%!!3!"!!%
+!"!!%!!3!"!!%rj!%8P)`-J!!!"J!N!8@!*!&&J#3"4B!N!8@3e)`-J!!!"J!N!9
+#!*!&3J#3"8)!N!9#8NJ`-3!!!#S!"!!!!!%!!3"(Sm!!!!!#!!)!N!F$!!-!N!F
+%!!3!N!FU!!%"!J!3!*!(!`!$!!-!!`#3#dHMa!!&!!%!!!!#3M%SD#N!N!4$5$!
+a!!!!+J!%!!!!!3!"!%HMc!!!!!)!!J#3"`-!!`#3"`3!"!#3"bS!!3%#!"!!N!F
+$!!-!!`!$!*!,4k23!!8!!3!!!!&"-LKS+3#3"&4--$%!!!!U!!%"!J!3!*!(!`!
+$!!-!!`#3#dHMh!!)!!%!!!!$E@%JG'&LE'934$%`!!!!!J!"8%3a-3!!!!)!$&"
+%-6)!!!!"!&"%-6-!!!!#!!*&4$!a!!!!!3!%!!3!!!!U!!%"!3!3!*!(!`!$!!-
+!!`#3#dHMj!!#!!%!N!4&08j%-$)!!!!B!!!!!3#3%8HMm!!!!#S!!3%"!!d!N!F
+$!!-!!`!$!*!,4k0m!!8!!3!!!!4ZEh4PFe46-$%!!!"b!!F!!3!!!"!!$!!$!!!
+!$!!"!!%!!!!3!!`!!`!!!!`!!3!"!!!!%!!-!!-!!!!-!!%!!3!!!"!!$!!$!!!
+!$!!"!!%!!!!0!!S!!`!!!!S!!3!"!!!!%!!-!!-!!!!-!!%!!3!!!"!!$!!$!!!
+!$!!"4Ni`-J!!!!%!!`C(C@jPGQ&%3M!b!!!!#3!"-!!0!!`!!84'-$%!!!!1$9T
+KF'BJ4'PZCf*KG(0%6$!a!!!!4J!"!!d!$3eDBA"Q)%4TEQGLBA4c!*!b8%%`-3!
+!!!)"!&""-$)!!!!%!!%!!9"#-$!!N!433M%`!*!%9%924J#3"3%!#J#3"E3"@`!
++!*!*0!#3"E3"@`#K!,B!"!!"!!%!)!#c!!%!X`&D!#!!!3&D!,-"@J#K!,B!"!!
+"!!%!)!#3"E)!!!!J!!!"@3#b!9N!)!#3"J&C!#!!XJ!!!,)"@3!L!!8!"3!A!#)
+!"3&8!"F!)!!&!!8!"3&8!#!!(!!&!"`"9!!L!*N!"3!8!#)!Q3&8!"3!)!#C!!8
+!Q3&8!#!!V3!&!+d"9!!"!!S!1!!!!,3"@`!L!$J!"3!A!#)!1!")!"F!)J!i!!9
+$!!!L!%m!"8-!!#)!6`!&!"F!)J"2!%J!&`!L!%m!"8-!!#)!CJ!&3`!!)J"Q!!8
+!&`!L!'B!5!!A!#)!CJ!&3`!!)J"p!!9$!!!L!(d!"3!A!#)!I3")!"F!)J"p!!9
+$!!!L!*3!"8-!!!%!#J!!!%J!Y!&E!#)!)3")!"F!)J!K!)X!&`!L!#%!5%-!!#)
+!1!")3`!!)J!K!)X!&`!L!#%!cJ!A!#)!)3#,3`!!)J!i!)Y$!!!L!#%!cJ!A!#)
+!)3%4!"F!)J!K!-j$!!!L!$J!cN-!!#)!)3%4!"F!)J!K!93!&`!L!#%"%8-!!#)
+!1!%43`!!!3!+!*!&Y!&E!#)!)3!&!"F!)J!K!!9$!!!L!$J!"8-!!#)!)3!&3aF
+!!3!+!$J!5!#d!9X!)`"F!#)!1!&8!&`!)J!i!)X!A!!L!$J!cJ"F!#)!1!%4!&`
+!)!!i!%J!1!&8!#!!P!")!*3"9!!J!%m!5!"2!93!)!"Q!%J!CJ&8!#!!I3")!(d
+"9!!"!!S!2!!*!%`!43!X!!N!!`C(C@jPGQ%!!!-!!`!0!!`!,J!%!*!&+aG)"8)
+a+'JT!!%!#J!*!!N!'3&4!#J!&3#5#'eK)(4KBQaP!!!"!!S!*3"-!$8!L!!S!$%
+!@39"-LKS+3!"!!S!R3!*!+S"83!0!!S!+!#R!!S&EQpdCA-!!3!+!)%"&3#4!9%
+!$3!-!#J!M3%@!N8e!!$r!!!&iJ#3"d)!$!#3%J(8!*!R#!!!!'S!$!#3%J(8!*!
+K"3!5!!!"!*!%*!!!!J#3"$B!!!-!N!4)!!!%!*!%@3!!"J#3#!S!!!#+!!`!N")
+"e!#3)3N!%J!!!3#3"#3!!!)!N!3f!!!$!*!%5!!!"!#3"&N!!!B!N!4X!!!",J!
+!!(i!!!%Y!!!!N3!!!9m!!!#d!!!"B3#3"``!!!"+!!`!N!X$!!!!%!!!!G3!N#%
+"!!S!!!%!N!J0!!!!3J!-!*!,'`!!!"!!!!(8!*!R$J!!!%)!$!#3#aX!!!!3!!!
+"X!#3*`m!!!"#!!`!N")"e!#3*a!!!!"#!!`!N!F"!*!+!G3!N#F4!!!!3J!-!*!
+(!J#3#J(8!*!R%J!!!%)!$!#3"`-!N!S"e!#3*a-!!!"#!!`!!!!+!*!1!G3!N#F
+8!!!!3J!-!!!!!4QD!*!-!G3!N#F@!!!!3J!-!*!5!G3!N#FA!!!!3J!-!*!5!G3
+!N#FB!!!!3J!0'CS!N"!"e!#3*aN!!!"#!!dCQJ#3%!(8!!!"!*!N'J!!!%)!!J#
+3%J(8!!!#!*!N'`!!!%)!'!#3%J(8!*!R(!!!!%)!!3#3%J(8!!!#!*!N(3!!!%)
+!$!#3%J(8!*!NIrrrr`#33!+!!*!0!J!"!!!!!3!!!!)!!3!%!*!&!J!#!!!!!J!
+!!!)!!J!'!*!&!J!$!!!!!`!!!!)!"!!!!!3!!!!#!!3!#`#3"3)!"3!!!!8!!!!
+#!!8!#3#3"3)!"J!!!!B!!!!#!!F!!!!(!!!!!J!)!!!!#!!!!!)!#!!*!*!&!`#
+3"3N!!!!$!!!!#!#3"3-!!3!!!!S!!!!$!!%!$J#3"3-!!J!!!!X!!!!$!!)!$`#
+3"3-!!`!!!!`!!!!$!!-!$3#3"3-!"!!!!!d!!!!$!!3!$!#3"3-!"3!!!!i!!!!
+$!!8!#J#3"33!N!82!!!!"!!!!!d!N!8%!!%!!!!3!!!!"!!"!!F!N!8%!!)!!!!
+4!!!!"!!#!!B!N!8%!!-!!!!5!!!!"!!$!!F!N!8%!!3!!!!6!!!!"!!%!!N!N!8
+%!!8!!!!8!!!!"!!&!!-!N!8&!!%!!!!9!!!!"3!"!!-!N!8&!!)!!!!@!!!!"3!
+#!!8!N!8&!!-!!!!A!!!!"3!$!!3!N!8&!!3!!!!B!!!!"3!%!!3!N!8&!!8!!!!
+C!!!!"3!&!!F!N!8&!!B!!!!D!!!!"3!'!!B!N!8&!!F!!!!E!!!!"3!(!!8!N!8
+'!*!&(!!!!!B!!!!*!*!&"J!#!!!!(3!!!!B!!J!(!*!&"J!$!!!!(J!!!!B!!`!
++!*!&&3!$!!!!(`!!!"8!!`!"!*!&&`!$!!!!)!!!!"F!#`!#!*!&'`#3"5%!!!!
+E!!!!!3#3"4`!!!!8!!d![!#D!B-,Z3!!!"B!!J"!!)m!q!Zk!!!!c!!"!"!!!!$
+-Irrqh`!!!"!!!J!3!!!!*Rrrrrm!!!!"!!-!$!!!!!Krrrrr!!!#VJ!!!Um!!!!
+#!"!!!!!k!!!!!3!!!!%!!`!-!!!!"!!!!!%!!!!"!!!!!`!-!!!!#`!!!'3+B5"
+ZCAFJE@&bD`!!!J!3!!!!*Rrrrrm!!!!"!!-!$!!!!!Krrrrr!!!#Y3!!!VX!!!!
+#!"!!!!!f!!!!!3!!!!%!!`!-!!!!"!!!!!%!!!!#!!!!!`!-!!!!"J!!!'3&E@&
+bDc)!N!91!!%!%!!!!%jrrrlI!!!!%!!#!"!!!!!q!!!!"J!!!!%!!`!-!!!!!3!
+!!!)!!`!$!!`!!!!%!!!!!rrrJ"3!!`!$!!`!!!!"!!!!"!!,!!!0"!!!!!-!$!#
+332q3"!#3'`-!$!!"!*!qrj!%!*!E!`!-!!)!N$lrN!3!N"X$!!`!"!#32[q3"!#
+3'`-!$!!!!!J!N$crN!3!N"X$!!`!!!!3!*!mrj!%!*!E!`!-!!J!N$lrN!3!N"X
+$!!`!%!#32[q3"!#3'`-!$!!J!*!qrj!%!*!E!`!-!%!!N$lrN!3!N"X$!!`!!!!
+"!*!mrj!%!*!E!`!-!!3!!J#322q3"!#3'`-!$!!%!!3!N$crN!3!N"X$!!`!!"!
+)!*!mrj!%!*!E!`!-!!!J%!#322q3"!#3'`-!$!!!!#!!N$crN!3!N"X$!!`!!!"
+!!*!mrj!%!*!E!`!-!!"!!*!prj!%!*!E!`!-!!!"!*!prj!%!*!E!`!-!!!!J!#
+322q3"!#3'`-!$!!!!J#32Iq3"!#3'`-!$!#3#3%!N$ErN!3!N"X$!!`!N!N#!*!
+frj!%!*!E!`!-!*!*!`#30[q3"!#3'`-!$!#3#33!N$ErN!3!N"X$!!`!N!N&!*!
+frj!%!*!E!`!-!*!*"J#30[q3"!#3'`-!$!#3#3F!N$ErN!3!N"X$!!`!!!3!N$h
+rN!3!N"X$!!`!N!B)!*!jrj!%!*!E!`!-!*!'!3#31Iq3"!#3'`-!$!#3"b!!N!d
+"!*!Y&J#3'`-!$!#3&3%!!3#3+2q3"!!!J!N!N"3$krm"!9X!N%$rN!3!N!9B5IV
+r6!#3"!&Erd`!N!3"@`!!!-S$k`!#!3!!!3!#!*#E%!#3*c`!!3!3!!!!2(rrrYm
+!!!!3!!)!%!!!!#arrrrr!!!!!J!$!!`!!!!1!!!!!94jBfm!N!Hd!9X"@`!!!!)
+!N!3#C(m0"9C8-6!`#!3%@Q9KE!!!$3eDBA"Q)%4TEQGLBA4c!")0@Q&`CL"$D'&
+ZBf9bH40@"e48@8C[ER3!&!98D@ePF`3"#&4PE'9dCAKd!!!A"P0jE@*[E!`(rJ9
+6GfPZCbU+$P0MFQP`G#"09#"#EfaNS!!3#&"KE'&dD@j[8`Ii"NpiCQpbC!!(pJ4
+2ERPi!LU4%dpXC#"&EQGXDA0S)&4PH(3J693(p""2E'3J4@jRE'PcD#"8CAKd8`!
+##%jPGb"CEh*V!!!L%NjPGb"$C@jdGA*j)&0MD'aLD`)UR3p1CAFJ3Q9bEfaTEQ%
+J693(l3K1B@4TB@jZC4!!$a*1)%KPE(CPG'PMB5"1BA*bEhF!#G-)693J4AKdFQ%
+B!!3'6@pZB@0[+3IS"deKBfKTEQ8(!!e-G@0TC'%J3R*TCfKd"q%06(9LB@aTEL"
+(FQ&`D#TB#%YXB@jR)%e8!$RE&%KPE(CPG'PMB5"$Efe`FQ9cFf9N!MTq$dKPE(C
+PG'PMB5"#E'&MD`!9#8KPE(CPG'PMB6UM'%GTE'`J8f&ZFb"$EfjNC@jcC@3J3Qp
+XC&-!!`C(C@jPGQ%!"p!24f&bB@e[EQ3J6Q&bFQph#lF-C9G[FQaN)&4TCfKd!#C
+b$N9cF(NJ8f&ZFb"#EfaNN!!QF!P&Fh"j)&0KER-(e`K%C@a`D'PKEJ!!&JG$Eh9
+bD@9b!!!(3fKTBf&RE`!1"d*[EfYYB@iUc44#Ef4[EQNJ693J9@adFQ%J3QpXC&B
+!)3Y"GQ&ZG#"(BA*NC5VA'%&bD@&X)%e8)%0[EQ4PER0PC#"-D@GSG%J!!!V'!!%
+!%!!!#XCrrrlI!!!!%!!#!"!!!!#m!!!!!3!!!!%!!`!-!!!!#3!!!!))3fKKF(4
+PFL"c!!-!$!!!!!3!!!!$!!!!(@eK!!-!$!!!!!%!!!!%!'i!!`!-!!!!!J!!!!8
+!!$Ji!!-!$!!!!!)!!!!'!!%d,J!$!!`!!!!#!!!!"`!"B@F!!`!-!!!!"!!!!!J
+!N!3Z)!!$!!`!!!!%!!!!#3!!!!%JC!!$!!`!!!!#!!!!#J%"EQm!!`!-!!!!"!!
+!!!X!!!!"GA-!!J!3!!!!Y!!!!!%!!!!"!!-!$!!!!!%!!!!#!'`!!`!-!!!!"!!
+!!!-!!!!G)&3!!`!-!!!!!3!!!!3!H3!$!!`!!!!#!!!!"3!!G'%!!`!-!!!!!J!
+!!!B!!@&b!!-!$!!!!!)!!!!(!!%j+3!$!!`!!!!%!!!!#!#3"`-!$!!!!!3!!!!
+*!!!!!J!!!!-!$!!!!!)!!!!+!3*H!!!$!!`!!!!%!!!!#`!!!!(rr`!#!"!!!!#
+d!!!!!3!!!!%!!`!-!!!!!3!!!!)!!!!$!!`!!!!%!!!!!`!!!"fm!!!$!!`!!!!
+"!!!!"!!!!!-!$!!!!!)!!!!&!*!&!`!-!!!!!J!!!!B!!Im-!!-!$!!!!!)!!!!
+(!!(i!!!$!!`!!!!%!!!!#!#3"'3!!!-!$!!!!!3!!!!*!!!!!d!!!!-!$!!!!!)
+!!!!+!31J!!!$!!`!!!!%!!!!#`!!!!&E!!!#!"!!!!#d!!!!!3!!!!%!!`!-!!!
+!!3!!!!)!!!!$!!`!!!!%!!!!!`!!!"fd!3!$!!`!!!!"!!!!"!!(!!-!$!!!!!)
+!!!!&!*!&!`!-!!!!!J!!!!B!!3!!!!-!$!!!!!)!!!!(!!%!!!!$!!`!!!!%!!!
+!#!#3"%$r!!-!$!!!!!3!!!!*!!!!"!!"!!-!$!!!!!)!!!!+!33!!!!$!!`!!!!
+%!!!!#`!!!!%"!!!#!"!!!!#k!!!!!3!!!!%!!`!-!!!!"`!!!!)'9'&LE'8J!3!
+$!!`!!!!%!!!!!`!!!"e5-!!$!!`!!!!"!!!!"!$!!!-!$!!!!!)!!!!&!!!"!!!
+$!!`!!!!#!!!!"J!"4k-!!`!-!!!!!J!!!!F!!8HM!!-!$!!!!!3!!!!)!*!(!`!
+-!!!!"!!!!!N!!!!&8c!!!`!-!!!!!J!!!!S""3!"!!-!$!!!!!3!!!!,!!!!!3%
+"!!)!%!!!!,i!!!!"!!!!!3!$!!`!!!!+!!!!!JP&FA9KG'P[EL!!!!!$!!`!!!!
+%!!!!!`!!!"d!!!!$!!`!!!!"!!!!"!!!!!-!$!!!!!)!!!!&!*!&!`!-!!!!!J!
+!!!B!!3%!!!-!$!!!!!)!!!!(!!%'4`!$!!`!!!!%!!!!#!#3"`-!$!!!!!3!!!!
+*!!!!"J!!!!-!$!!!!!)!!!!+!3B!!!!$!!`!!!!%!!!!#`!!!!%$!!!#!"!!!!#
+m!!!!!3!!!!%!!`!-!!!!#!!!!!)(4QPRGA*P)!!!!!-!$!!!!!3!!!!$!!!!(3!
+!!!-!$!!!!!%!!!!%!!!!!`!-!!!!!J!!!!8!N!8$!!`!!!!#!!!!"J!"$!!!!`!
+-!!!!!J!!!!F!!3-!!!-!$!!!!!3!!!!)!*!(!`!-!!!!"!!!!!N!!!!(!!!!!`!
+-!!!!!J!!!!S""`!!!!-!$!!!!!3!!!!,!!!!!3!!!!)!%!!!!,i!!!!"!!!!!3!
+$!!`!!!!'!!!!!J9dCAKdC3C(!!-!$!!!!!3!!!!$!!!!(3!!!!-!$!!!!!%!!!!
+%!!!!!`!-!!!!!J!!!!8!!`!!!!-!$!!!!!)!!!!'!!-!!!!$!!`!!!!#!!!!"`!
+%!!!!!`!-!!!!"!!!!!J!N!3'4`!$!!`!!!!%!!!!#3!!!!J!!!!$!!`!!!!(!!!
+!#JB)BA"bCA-!!!-!$!!!!!3!!!!,!!!!!J!!!!)!%!!!!,3!!!!"!!!!!3!$!!`
+!!!!"!!!!!J!!!!-!$!!!!!3!!!!$!!!!(@%!!!-!$!!!!!%!!!!%!!!!!`!-!!!
+!!J!!!!8!N!8$!!`!!!!#!!!!"J!"!!!!!`!-!!!!!J!!!!F!!3!!!!-!$!!!!!3
+!!!!)!*!%!3!!!`!-!!!!"!!!!!N!!!!*-J!!!`!-!!!!!J!!!!S"#4B!!!-!$!!
+!!!3!!!!,!!!!!3!!!!)!%!!!!,3!!!!"!!!!!3!$!!`!!!!"!!!!!J!!!!-!$!!
+!!!3!!!!$!!!!(3!!!!-!$!!!!!%!!!!%!!!!!`!-!!!!!J!!!!8!N!8$!!`!!!!
+#!!!!"J!"!`!!!`!-!!!!!J!!!!F!!3!!!!-!$!!!!!3!!!!)!*!(!`!-!!!!"!!
+!!!N!!!!+!!%!!`!-!!!!!J!!!!S"#J!!!!-!$!!!!!3!!!!,!!!!!3!!!!)!%!!
+!!,3!!!!"!!!!!3!$!!`!!!!"!!!!!J!!!!-!$!!!!!3!!!!$!!!!(8%b!!-!$!!
+!!!%!!!!%!!!!!`!-!!!!!J!!!!8!!!-!!!-!$!!!!!)!!!!'!!%!!!!$!!`!!!!
+#!!!!"`!"G'%!!`!-!!!!"!!!!!J!N!3a!!!$!!`!!!!%!!!!#3!!!!Xa-`!$!!`
+!!!!#!!!!#J%,!!3!!`!-!!!!"!!!!!X!!!!"!!!!!J!3!!!!Y!!!!!%!!!!"!!-
+!$!!!!!%!!!!#!!!!!`!-!!!!"!!!!!-!!!!G!!!!!`!-!!!!!3!!!!3!4`!$!!`
+!!!!#!!!!"3#3"3-!$!!!!!)!!!!'!!%!!!!$!!`!!!!#!!!!"`!"!!3!!`!-!!!
+!"!!!!!J!N!3"!!!$!!`!!!!%!!!!#3!!!!`!!!!$!!`!!!!#!!!!#J%-!!!!!`!
+-!!!!"!!!!!X!!!!"%!!!!J!3!!!!Y!!!!!%!!!!"!!-!$!!!!!%!!!!#!!!!!`!
+-!!!!"!!!!!-!!!!G%!!!!`!-!!!!!3!!!!3!!!!$!!`!!!!#!!!!"3!!-$)!!`!
+-!!!!!J!!!!B!!8B`!!-!$!!!!!)!!!!(!!&RBJ!$!!`!!!!%!!!!#!#3"!d0!!-
+!$!!!!!3!!!!*!!!!$3!!!!-!$!!!!!)!!!!+!3d!!!!$!!`!!!!%!!!!#`!!!!%
+!!!!#!"!!!!#d!!!!!3!!!!%!!`!-!!!!!3!!!!)!!!!$!!`!!!!%!!!!!`!!!"d
+!!!!$!!`!!!!"!!!!"!!!!!-!$!!!!!)!!!!&!*!&!`!-!!!!!J!!!!B!!EB!!!-
+!$!!!!!)!!!!(!!&D!!!$!!`!!!!%!!!!#!#3"!%!!!-!$!!!!!3!!!!*!!!!$PN
+!!!-!$!!!!!)!!!!+!3iJ!!!$!!`!!!!%!!!!#`!!!!%L!!!#!"!!!!#d!!!!!J!
+!!!%!!`!-!!!!!3!!!!)!!!!$!!`!!!!%!!!!!`!!!"d&!!!$!!`!!!!"!!!!"!!
+!!!-!$!!!!!)!!!!&!!!i!!!$!!`!!!!#!!!!"J!"1!!!!`!-!!!!!J!!!!F!!8m
+!!!-!$!!!!!3!!!!)!*!%"8-!!`!-!!!!"!!!!!N!!!!2&`!!!`!-!!!!!J!!!!S
+"$`!!!!-!$!!!!!3!!!!,!!!!!5)!N!6f!!%!%!!!!2CrrrlI!!!!%!!#!"!!!!$
+QIrrrrJ!!!!%!!`!-!!!!A!!!!5b!!*"+!3#3%`-!$!!!!#3!!!"N!!!!!3#3"bJ
+!N"X$!!`!!!!3!!!!H!p%Ef0eE@9ZG#"6Eh9ZC(-!!!!$!!`!N!GZ!!!!!`!-!!!
+!!3!!!-J!N!9i!!m!!!")!%J!N!3#m!*!rr(rlJ-*!P*M!J8S!r`"!!!!!@J"D!#
+3"!k`#d!!!3%!!'3!!3!!!!%!!J!!!!%R$`!"!*!1%!#3#4!!rlArTJmY#jS!#!%
+!N!dC!3!!!!i!N"'L!)J*!3#3"J,`!N!!&3!f!Z8##J!9!$B#j3)+!*!**!!!!!-
+!!3#3"3%!N!J"!*!B5!")rr(rlJ-*!P)!!!%!!!%")!&p!*!L![!#3!!!!!%!!3!
+!!!&!!*!+G!#3$3)!N$N#!*![&J!'"@eKFQXb!!X+B5"ZCAFJE@&bD`#3"!3!N!F
+%!*!'!MS!!3!!!Um!!!+[!*!1!3%!N"%"!!%!!3!"lYflGqlGZhIrN!J!J!J)!!S
+!N#!"!!!!c'&cm`#3"3-!$!#3$3%!!!!"!!%!N!F"!!!!!3!*!!!!!3#3%J-!N!a
+@PNJ!!!!k!!!!1J#3"6S!1J"@PP`!!!!"!*!,!3#3@2m!N#`"!!%!!3!"lYflGql
+GZhIrN!J!r`J)!!!!-3#3"6%!N!8"!3#3"!8!*!"X!!!!#J!!!3#3$#J!!`&6!Id
+!N'ia!*!&-3#3"3%"!*!)!L)!!3#3"4)!%J#3"*QCrrm!N!ErN!B!N!ErN!B!N&E
+rN!B!N!ErN!B!N&#!!*$r!*"#!3!!!$QI!!!iR`!!!MB!9T@S'bi!!!!F!MB!'(C
+PFR-!!3$+8e45)!!!!1*%8%j%!!!!lP"*3e3!!J$k8P9-43!!!4j'8Ne8!!!"+P"
+*3d3!!!%f69*,0`!!!8*@39**!!!"6NC838)!!!&D8%a"3`!!!@C36%48!!!"FP"
+(8N%!!!&q4Na69!!!!BT%8e"-!!!"PP0(8$%!!!'L8&*&3`!!!Dj$8&*$!!!"ZP"
+(6&N!!!('8e4C6!!!!G*69%j0!!!"hP088N`!!!(U8e41@!!!!IC*6NC2!!!#!NP
+14M)!!!)1!!(rr`#3#3,rr`!!!%8!N!5rmrrr!!!!H`#3"!2Vrrm!!!%I!*!%#lR
+rr`!!!88!N!3,Z[rr!!!"T`#3"!2Vrrm!!!)"!*!%!q[rr`!!$(%!N!3$krrr!!!
+59`#3"!2Vrrm!!"6E!*!%!q[rr`!!&2X!N!3$krrr!!!9b`#3"!2Vrrm!!"BG!*!
+%!q[rr`!!)b8!N!3$krrr!!!Mm`#3"%iJrrm!!#3c!*!%!q[rr`!!*$N!N!3$krr
+r!!!QS3#3"!2Vrrm!!$&V!*!&J2rr!!!bC3#3"B$rr`!!-Z%!N!@!rrm!!$,c!*!
+%!q[rr`!!-jN!N!3$krrr!!!d%3#3"!2Vrrm!!$3V!*!%!q[rr`!!0$-!N!3$krr
+r!!!d1`#3"!2Vrrm!!$Cj!*!%(5B!:
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/RagTime_2.1.hqx b/writerperfect/qa/unit/data/writer/libmwaw/pass/RagTime_2.1.hqx
new file mode 100644
index 000000000..d644a59a2
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/RagTime_2.1.hqx
@@ -0,0 +1,24 @@
+(This file must be converted with BinHex 4.0)
+:#A4PFh3b,R*KC`"')bY%4L-V33%!!!!$3J!!!HBhq3!!!`X#3!!"!*!)D)pSMfL
+2rr-!N!CSMfL2D)m!N!EcMqq!!'8!!`!)`G!!N%-#!*!&!3!"!!%!!!,`!N!!4[[
+-!*!&4[UX!%%!"!(F!R`!!3#3"3%!!!!#!3)!N!8"!!)!!!!V!!)!!!!V!JJ!J!(
+L!%EkP!!!!!N!N!9'qE`!4[Mm!*!&!`!(!*!+!84N!3!!C!%!N!B"!*!&![!#3!#
+3"`)!!3!"!!)!N!S"c!))S)!$kJ!S!#J#b!)B!*!'J!%!!!!"!!%!!'3"!!"N!3!
+!!H)!!!#)!!F!#2q3#!!"rri!N!F"rrrm!20p"5m!!!!$mYF)9S6X!!!!"0eV#-)
+'SJ#3"!*"Ue6Ur`!!!!8!!)!!%E!!!!!"!*!%e!#3"!)%9f9TT`a6BfKhBA*k,eG
+PDDF%4f9XBJG0B@GPER4K!e*[G!4$H@&Z"%GbRfi%3QaKG3!8!*!*$QCB!!jQ@!!
+&!!!"8!#B!##3"'%JF'%ICf8JER9Y(f*PFL"TEL"K)&*KCe4TE@8J-Lia)'CT(fa
+P$3d0BQpXC#"TG'&XD@-JG@jNCA*XD@jP)(0eF'9bFf0bDA"dFh9LFf0bDA"d$80
+SD@0KCfmX)%0[GA*TCA)X)$%`F'pTER4c,#!b0#"`EfPZG(-X)!e`B4pRC3-J)'4
+K(h4P!5!JG'PYC5!#$3!5!!!-!!!$!!!!,J`"!!-!!!!b$!!!!`!!!$--!J!$!!!
+!13`!!!-!!!!k$!3!!`!!!%--!!!$!!!!4!b!!!-!!!"2M!!!!`!!!&J-!!!$!!!
+!@3`!N!CJ$!!!!`!!!')-!!!@!!!!D3`!!!-!!!"V#J!!!`!!!(--!!!$!!!!G4J
+!!!-!!!"q$!!!!`!!!!%!N!3"k!!"!*!&'3#3"2!hrrm!!%Ap!*!%i!@!!*!%"J!
+#!#d!2-8J!!!"!!!!!D!!!!#J!!!!4J!!!!)-G'9cG%GbBA"S3eFc!J)!!J"$9dG
+53Np#6`%!#A4PFh3b,R*KC`)!!!"')bY%4L-V33#3$%BM+d4')bY"!*!Bcmiq+3#
+3"J(Q!*!+%J#3"!)-G'9cG%GbBA"S3eFd!J)!!J"$9dG53Np#6`%!!B!#!*!&!ZF
+!N!30J!!!%!#3"3'F!!!)!-j`l!A1F1`&!*!@"()!!J#3#!4f!!%!N!ei!!m!!!"
+)!%J!N!3#m!*!rr(rlJ-*!P*M!J8S!r`"!!!!!@J"D!#3"!k`#d!!!3%!!'3!!3!
+!!!%!!J!!!!%R$`!"!*!1%!#3#4!!rlArTJmY#jS!#!%!N!dC!3!!!#!Z,$XN!!$
+3!!![!'!J38d!)&"0!$S!N!S"!!!"!!!!!D!!!!#J!!!!4J"'J*JAi!!!!"`!4J!
+"8&*&3`!!!"**6P4-!!!!(K*Srrm!N!9'q'J!!2rr!!!!I!#3"0`E:
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/RagTime_3.2.hqx b/writerperfect/qa/unit/data/writer/libmwaw/pass/RagTime_3.2.hqx
new file mode 100644
index 000000000..55ecf4faf
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/RagTime_3.2.hqx
@@ -0,0 +1,136 @@
+(This file must be converted with BinHex 4.0)
+:#A4PFh3c,R*KC`"5)bY%8L-V33%!!!!D1`!!!8)V!J!!!c-#C!!"!*!)D)pSMfL
+2rr-!N!CSMfL2D)m!N!EcMqq!!C!!!!-!+%"!!&Q1c!!!!&d!N!Ga!*!*@C!!d!%
+!!J#3#P-!!J#3"3%!!3!"!aJ!!!*N!!!!33!%!G`#I!!"!*!&!3!!!!)"!J!!!!%
+#!!!"!!!!J!(L!!%!!J!!!!)!!!#,!!)!!!#,!*!&!`!(!*!*!3#3&3%"!*!*!aJ
+!!!*N!*!*!J!"!!!!!3!#!*!-''-#!3!!J)!,kJ!h!!!!1J!!!YF!!!)U!*!)J!%
+!!J!!!!%!!3!!!J!!!3!#!*!%'(N!SJ!!!+*'Ee4K!*!%!IT'Ee4K!!%!!!0K4NK
+QE!#3"!2C4NKhE!#3""*c4NKcE!#3""4a8f9XC3#3""4j3dK8B3#3""8A3dK8B3!
+"!!!9D9"548-!B`!!&J9#C84M!*!%&Me#G'0S!*!%&NGQF("b!*!%&Q9RFQ&j!*!
+%&SpMEfab!*!%&VPbCA-J!*!%&Z0'6'PZ!*!%!93!)!!'!!J!!!!%!!)!!!$q!!!
+!!rrr!*!0!3"@!!!!!3"a!!!!!3#+!!!!!3#Y!!!!!3$4!!!!!3$`!!!!!3%-!!!
+!!3%[3IVqpJ&8%")5%J%!N!X2!3K6G'&ZC'&bC"!5%K)!!!%!N!N(!3C&ER4TCA)
+3&489!!)"!*!*"`N("`%!$&CTFQGeE'8JCQPiC4!E'aX!!J3!!!%!N!B'#JB'"`N
+("`T'!3!(6@pZEQ&TC4!9&48!!3%!!J#3"`F*"`i"!!K3Eh9bBf9ZG"!@&KB!!!3
+!!!%!N!B'#JB'"`%&-5!b-c33'4NC!!)%!!!"!*!'"JS'"JF*"`F"!!Ja)$)c0#`
+e-"!B'"J!!J%#!!!"!*!&"`N("``("`%-8f0TC@jdD@CTFA9P!!!"B`!J!!B!#J!
+!!!3!!J!!!3%!!!!$rrm!N!d#!')!!!!"!(N!!!!"!*3!!!!"!,!!!!!#!0J!!!!
+"!1i!!!!"!33!!!!"!4d!!!!"!63!!!!"!8P"q[lf!@-!!!!1$!!!!!`[%#m9!3J
+c,c3[-6Ni13!!!!i-!!!!$#!6)"8"$$-J3ACbD@`J-6Ni13!!!"!-!!!!$b!-)"-
+J&3%,4QpbE@&d)'a[EQF!!!!9"`!!!!`[%#m9)#!+1JNk"`%!%6-[0#ma16Jj)#!
+j1M-`1M!d!!!!$JN!!!!+)'JJ#3%(15"S)$-`)!!!!!i(!!!!#MS*1JF""cNk-c!
+k-$3!!!!1$3!!!!d[%5m9!3S`-bm`0#ma16Jj!!!!$J`!!!!-)")J&!%)-b""GR)
+J1$N!!!!-%`!!!"-J&!%)3ACbD@`J1$N!!!!1$!!!!"![$#m9!3Y%BA4P)&8Z8bj
+",J!!!(3!)!!3!!-!!J!#!!3!!!!8!!!!"[rr!*!,$3!!!'!!!`#3#3)!!!"Q!"B
+!N!N#!!!!E3#3#[mq!!!!G'F',`j1Z[cU60p(C@jPGQ&$Eh9bD@9b3fKTBf&RE`!
+!$TB!*J)3!!B#!!!#!*!*"Irq!*!*!3!!!"F##!!&!!#J!*!*S!#J!+!!J!#J!+!
+!S!!!!+!!S!#J!+!!S!#J!+!!S!#J!+!!S!#J!+!!S!#J!+!!S!#J!%!!-!"3!*!
+!!(!!N!!!N!!!-!"3!&!!J!"`!%!!F!!`!(!!J!#!!)!!J!#!!)!!J!#!!)!!J!!
+`!%!!B!"`!'!!J!#J!*!!!)!!J!#!!(!!F!#!!)!!8!"`!)!!F!#3!!#!!)!!J!#
+!!)!!J!#!!)!!N!!!X!"`!(!!F!"!!(!!3!"!!)!!3!"`!(!!F!"`!(!!B!"`!(!
+!8!"J!(!!8!#`!(!!F!"`!(!!B!"`!'!!F!"`!,!!F!"`!(!!8!!`!&!!J!!!!*!
+!!*!!!)!!F!#!!)!!J!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!8!"3!&!!8!"`!(!
+!F!"`!(!!F!"`!(!!F!"`!&!!B!"`!)!!J!#!!)!!N!!!S!#J!,!!3!"3!)!!`!#
+!!,!!F!"J!'!!F!#3!!"`!)!!N!!!S!"3!'!!B!#J!,!!F!#!!%!!F!#J!&!!J!#
+3!!#!!)!!S!#!!*!!!*!!!)!!`!#`!'!!N!!!F!"`!%!!3!"`!*!!!)!!m!#J!+!
+!S!#J!+!!S!#J!+!!S!#J!+!!S!#J!+!!S!#J!+!!S!#J!+!!S!#J!+!!S!#J!+!
+!S!#J!+!!S!#J!+!!S!#J!+!!S!#J!+!!!!a63'F3!!%!!!!-!!!!!3!!@!#3#9J
+!@!"B!%J!@!"B!&J!!!"B!&J!@!"B!&J!@!"B!&J!@!"B!&J!@!"B!&J!@!"B!&J
+!@!!S!#!!-!"3!%!!8!"3!#!!-!!`!%J!3!!S!%!!)!"!!%J!5!")!%J!5!")!%J
+!5!")!%J!)!!S!$J!3!!i!%J!@!"3!%J!5!")!%!!3!")!%J!-!"!!%J!3!"3!%J
+!5!")!%J!5!")!%J!5!"3!'!!3!"!!%!!+!"!!#J!+!")!#J!3!"!!%!!3!"!!$J
+!3!"!!$!!1!"!!$!!B!"!!%!!3!"!!$J!3!!i!%!!3!"J!%!!3!"!!$!!)!!`!%J
+!!!"3!&!!5!"!!%J!5!")!%!!3!"!!%!!3!"!!%!!3!"!!%!!3!!`!$!!-!!`!%!
+!3!"!!%!!3!"!!%!!3!"!!%!!-!!i!%!!5!")!%J!5!"3!&J!@!"J!#J!-!")!'J
+!5!"J!%!!1!!i!%!!8!"!!%J!8!"B!$!!1!!i!&J!B!"!!%J!+!"!!&J!-!")!&!
+!5!")!&J!5!"3!&!!5!"S!'!!1!"3!%!!3!!S!#J!3!"3!%J!J!"B!&J!@!"B!&J
+!@!"B!&J!@!"B!&J!@!"B!&J!@!"B!&J!@!"B!&J!@!"B!&J!@!"B!&J!@!"B!&J
+!@!"B!&J!@!"B!&J!@!"B!&J!!!XZP!"C!!%!!3!-!!!!!3!!S!#J!+!!S!#J!+!
+!S!#J!)!!S!#J!+!!!!#J!+!!X!#`!,!!N!!!X!#J!+!!S!#J!+!!S!#J!+!!S!#
+J!+!!3!"J!(!!S!"`!,!!S!!`!&!!8!"`!(!!3!"`!%!!F!#!!)!!J!#!!)!!J!#
+!!)!!J!#!!%!!3!"J!)!!B!#!!,!!J!#!!)!!J!"`!(!!J!#!!'!!F!#3!!"`!-!
+!N!!!J!#!!)!!J!"`!'!!J!#!!-!!J!#!!)!!8!"`!&!!J!#!!'!!J!#!!(!!J!#
+!!'!!J!#!!%!!B!#!!%!!`!#!!)!!J!#!!'!!F!"J!)!!J!$!!)!!J!#!!&!!8!"
+3!)!!J!#!!)!!J!"`!*!!!)!!J!#!!)!!J!#!!)!!J!#!!)!!J!#!!)!!B!"J!'!
+!B!#!!)!!J!#!!)!!J!#!!)!!J!#!!&!!B!"`!*!!!(!!F!#3!!#3!!#J!+!!X!"
+3!'!!N!!!X!#3!!$J!(!!B!"J!+!!S!#!!*!!!+!!X!"J!(!!F!#J!-!!J!#!!'!
+!F!$!!'!!S!#3!!#3!!#3!!$J!)!!J!#!!)!!X!$!!'!!S!"`!(!!3!"!!(!!N!!
+!J!#J!+!!S!#J!+!!S!#J!+!!S!#J!+!!S!#J!+!!S!#J!+!!S!#J!+!!S!#J!+!
+!X!#J!+!!S!#J!+!!S!#J!+!!S!#J!+!!S!#J!+!!S!!!$#lN!&N!!`!!!!`!!!!
+"F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!!!!(!!F!"`!(!!F!"`!(!!F!"`!(!
+!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!
+!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!
+!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!
+!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!
+!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!
+!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!
+!N!!!N!!!X!"`!(!!F!"`!(!!N!!!F!"`!(!!F!"`!'!!N!!!S!"`!$!!F!"`!*!
+!!(!!F!"`!(!!N!!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!
+!F!"`!'!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!
+!F!"`!(!!S!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!!!$#li!&N!!J!
+!!!`!!!!"!!#!!*!*J!#!!)!!B!#!!)!!J!!!!)!!J!#!!)!!J!#!!)!!J!#!!)!
+!J!#!!)!!J!#!!)!!J!#!!$!!3!"3!*!!!(!!S!#!!$!!B!"J!(!!J!"!!(!!-!"
+J!(!!F!"`!(!!F!"`!(!!F!"`!(!!-!"!!&!!F!"3!(!!N!!!B!"`!'!!F!"J!'!
+!B!"`!%!!B!"`!'!!N!!!F!"J!(!!B!"`!'!!B!"`!'!!S!"J!'!!B!"3!&!!8!"
+3!(!!3!"3!'!!8!"3!&!!3!"3!'!!3!"3!'!!3!#3!!"J!&!!B!"3!'!!8!"!!'!
+!B!#!!'!!B!"3!&!!3!"3!(!!!!"J!'!!B!"J!(!!B!"`!&!!8!"3!&!!B!"3!&!
+!8!"3!&!!8!"!!%!!8!"!!'!!8!"3!&!!8!"J!'!!B!"J!'!!8!"3!'!!F!"J!'!
+!B!"`!+!!S!#3!!!`!%!!F!#3!!#!!,!!F!"`!(!!F!"`!&!!F!"`!)!!8!"3!&!
+!J!#!!(!!F!"!!(!!N!!!8!"`!(!!J!"`!*!!!(!!B!"`!(!!N!!!J!"J!*!!!(!
+!F!"!!%!!J!#3!!"J!-!!J!#!!)!!J!#!!)!!J!#!!)!!J!#!!)!!J!#!!)!!J!#
+!!)!!J!#!!)!!J!#!!)!!J!#!!)!!J!#!!)!!J!#!!)!!J!#!!)!!J!#!!!!-,``
+!@3!"!!!!#J!!!!%!!+!!N!QJ!+!!S!#!!+!!S!#J!!!!S!#J!+!!S!#J!+!!S!#
+J!+!!S!#J!+!!S!#J!+!!S!#J!+!!3!!`!&!!N!!!F!#3!!#3!!!`!&!!8!#!!(!
+!3!"`!$!!F!#!!)!!J!#!!)!!J!#!!)!!J!#!!$!!3!"J!(!!B!#!!+!!N!!!J!#
+!!)!!F!"`!)!!J!"3!(!!J!"`!*!!!)!!J!#!!)!!J!#!!)!!J!#3!!#`!(!!F!"
+`!%!!F!"!!%!!J!"!!(!!F!"`!(!!F!"J!(!!F!"3!'!!F!"3!,!!F!"`!(!!F!"
+J!(!!B!"`!(!!X!"`!(!!F!"3!$!!8!#!!!!!N!!!N!!!J!"`!)!!J!#!!(!!F!"
+`!(!!F!"`!(!!F!"`!(!!F!"3!&!!8!"3!(!!F!"`!(!!F!"`!(!!F!"`!(!!8!"
+J!(!!J!#!!)!!J!#3!!#J!+!!X!"!!&!!J!$!!)!!X!"`!'!!B!"`!*!!!(!!J!#
+3!!#J!&!!B!"J!+!!X!"`!)!!3!"`!+!!8!#!!*!!!)!!J!#J!)!!N!!!N!!!J!$
+!!,!!B!#3!!"`!(!!3!"!!(!!N!!!F!$`!+!!S!#J!+!!S!#J!+!!S!#J!+!!S!#
+J!+!!S!#J!+!!S!#J!+!!S!#J!+!!S!#J!+!!S!#J!+!!S!#J!+!!S!#J!+!!S!#
+J!+!!S!!!#bmJ!&N!!3!!!"J!!!"d!!!1e%KZrpBr2!!#6Ud))N(ZrqC$l[r@)0N
+Jf6#43QG#3"!ZrqE346m!2blrm%kY!S)`(dM!+8!!%NKZrqFJ,!!5d+`!$N*"%Ll
+rjNM"N!#",`"#3"!ZrqC)`#m!6Ud%%N)%%!4R!2p)60mBm%jH,Tp1G3%J6PErm%M
+R!4K#CbmYqQ3r,J!)5'lrp%+R6UdM5K!ICfC`!E"Zrr4X"N)Z!!TJALmYqQ3r,J!
+)6UdLSN+R,bhkC%kY)ASJAbC32@X!"2r`IJ*J,M!(`I`!$%Rc!"3`,!!+X'lrrQm
+'8f`!#Q!3-#`!#V"ZrrjQ"MPmrrd!#P*(D3DqE[r`Em`GI!!"!!T-haL!6PiJAe4
+26Y"19J!!3UF[,ITN6UdKHL"I)&!`,J!-`I`!$#*Z!!K"m!!B)0N`N8jH)&pF6dl
+36PErp%*R,bhkC$mZ!!a)E[rd3UG1V50+%"pR+#"Z!!K#3"!328$rpN*R,bhkC$m
+Z!!a)E[rd)'i!#%KS!!&1V5*L%"p1AL"IA%p1d%j@!!![$#KZ!!J3,2h!CM3CEGL
+rrEm3,2frCb*#CkQE3UF[2&""3dXr2!!-UD"+ReE!4!!C32fr(c`!!DQE'A`!!Ih
+!%#cp[fB1,c`!23I32ca998kY$5SGE2fr!!`SAdjH,Tp1G8j@r[T)j`!B+'i!#%+
+R2c`(q8+R6UdUSLCI5'lqqMmm"p!!!!(k!#`!+J!+!!J!"!#3#3Arr`#3#3)!!!!
+A!!3!!!!K!"!!!!!-!!%!$!#3#3%!$!!!!!-!!!!"!*!'J!!!#`"CN!!N!!!!!3!
+"!"J!N!N'!"B!!!!'!!!!!3#3"S!!!!S!@C%N!!!!!3!"!!S!N!N&!!S!!!!#!!!
+!!3#3"S!!!!X!@BmF!!!!!3!#!!`!N!N%!!S!!!!#!*!+J!!!#`"CMU3!!!!"!!-
+!$!#3#3-!$!!!!!-!!!!"!*!'J!!!#`"CMTJ!!!!"!!%!$!!!!3#3"J%!$!!!!!-
+!!!!"!*!'J!!!#`"CMT3!!!!"!!%!$!!!!)!!N!8"!!`!!!!$!!!!!3#3"S!!!!X
+!@Bm8!!!!!3!"!!`!!!!%!*!&!3!-!!!!!`!!!!%!N!D!!!!,!&Q1i!!!!!%!!3!
+-!!!!!J#3"3%!$!!!!!-!!!!"!*!'J!!!#`"CMh!!!!!"!!%!$!!!!!%!N!8#!!`
+!!!!$!!!!!3#3"S!!!!S!@BlF!!!!S!!#!!)!!!!D!!!!!rrq!*!,!`#!!*!'rrm
+!!3!!!!3!!!!"!!!!QJ!J!!`!"`!'!!)!!J!!!"S!!!!$rrm!N!X$!)!!N!Err`!
+"!)$m!20p"5m!!`!"!)6be`K@K1`!"!!#!)[GD`M#"U)!!!!"!)i#3DY8k[m!"3!
+"!*)!!)!!%E!!!3!#!*B!N!68!!!#Irm!QRrrIrprrm!!4f9XBNeKCf9ZG'&5Eh4
+$H@&Z4h+IEN*XBA8!!!"1!#B!#!!%!!3!"!#3#32rrJ#3#3%!!!!r!!3!!!!@!!%
+$k!!!!!-!!3#3"3%!"!2S!!!!!3!(!qKRQ!!!!$`!1J!!!*J!$`!!!%J!5!#3"!,
+`!N$rmIrZ!`N#8Q-#"5J$r!%!!!!"D!&S!*!%$V!,3!!"!3!!C!!"!!!!!3!#!!!
+!!5F2!!%!N!i3!*!*%!$rYIqQ$bd,QJ!)!3#3$4N"!#!!$`!5![m#8J#3#3%!!3#
+3$63!!3#3"eQ4$!#3%`%!!3!!!!`!!!!"!*!&"`2S!!-!!!!'!*!*'J!#!#d!2!!
+!!'3!!!"l!!!!K3!!!)m!N!FQ!#!!"J#3"3)!"!#3"`Irr`#3#J,@!!!!*J!!!#B
+!)!!'!!!!"!!#!*!*"rrr!*!6*J!J!!B!!!!%!!)!N!N(rrm!N"0%!#!!*!!!!"3
+!!J!%!*!(!rrr!*!24!#3(a3!N!N1CPJ!$QCB!!8!!!(!!+-!)*!%B5"`B4pRC5"
+ZG@dIBQ9b)'PZ)'%J8Q&R9'PYC5!c,M)JCQNIE'80$3eLEfaN)'PdB@aTBb"eEQ4
+PFQaTEQ8JFh9`CA*cBh*TF(4cG@*cBh*TF(303fKTBf&REb`J3fpeFQPPFL`J-6"
+`EfPZG(-X)$)d)("[D@jdFb`J$A*PC#!X)'*XG@80F'%ICf8")#"NB4pdC3%J)(4
+TE@8J!3d!!"8!!!!"!!!!!`!"!#i!#J!!!!-!!3!b!!%!!!!$!!%!-`!*!!!!!`!
+"!$N!!3!!!!-!!3!k!!J!!!!$!!%!3`!"!!!!!`!"!%3!"`!!!!-!!3"2!!B!!!!
+$!!%!@!!"!!!!!`!"!&N!"3!!!!-!!3"J!!%!!!!$!!%!BJ!%!!!!!`!"!'N!!3!
+!!!-!!3"V!!-!!!!$!!%!F`!"!!!!!`!"!(8!!J!!!!-!!3"q!!%!!!!$!!%!J3!
+"!!!!!`!$!)F!!3!!!!-!"!#,!!%!!!!$!!%!!3#3"!(S!!%!N!8C!*!%m$Irr`!
+!4Id!N!6J"3#3$)!!,J#3""!!"!%X!!B!C!!"!!B!C!!&Tc!!!!%!!!!"%!!!!"!
+!!!!b6Np"68&38%`"!*!A#A4PFh3c,R*KC`)!!J"5)bY%8L-V33#3#J)!8L-V4&)
+M+d%!N"M2cMji!*!'!8)!N!`"Q58"8(0[EN&38%`$!*!Hr#8"8LTMD%&38%`#!*!
+G!F%P!9*84d459&"'"J#3'!`,8Q&R9'PYC5!c,M)!!!%!!!!"%!!!!"!!!!!b!&C
+Sc"H#!!!!(!!b!!"69&)J!!!!#Vrdrrm!N!9CMEa0fJ:
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/RagTime_5.5.rag b/writerperfect/qa/unit/data/writer/libmwaw/pass/RagTime_5.5.rag
new file mode 100644
index 000000000..927c5c37c
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/RagTime_5.5.rag
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/SimpleText_1.0.hqx b/writerperfect/qa/unit/data/writer/libmwaw/pass/SimpleText_1.0.hqx
new file mode 100644
index 000000000..1c81129d6
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/SimpleText_1.0.hqx
@@ -0,0 +1,11 @@
+(This file must be converted with BinHex 4.0)
+:#R4PH(3a,R0dH(3!9%9B9(4dH(3!N!98!!!#&$6q35"cE@&XE#"6D@e`E'98CAK
+d)(4PH(30BQpXC#"TG'&XD@-JG@jNCA*XD@jP$6%i)("[D@jdFb`J-6)JF'pTER4
+c$80SD@0KCfmX)%0[GA*TCA)06b8!!!%!!!!"iJ!!!1)!!!!b8&0*-N&A8e-"!*!
+A#R4PH(3a,R0dH(3!!J!#!&4&@&4dG(Kd!*!)!J"849K8G(4iG!#3%)!!N!I2Y6C
+R!*!'!K3!N!e9*3&5Ffaf8e4"5`%!N"jF*3&@59-c39"36!)!N"j5*3&D48*539"
+36!%!N"MH!!X!N!8,!!N!"!!!!!N!N!NB!!X!#3!%!3!!#3#3#4`!#`!*!!3!!!!
+*!*!*(3!,!!N!"!)!!!N!N!NM!!X!#3!%!!!!#3#3#53!#`!*!!3%!!!*!*!*,3!
+,!!N!"!!!!!N!N!NZ!"J!%J!%!!!!%J#3#6N!%!!-!!3!!!!-!*!*3`!3!!`!N!8
+-!*!*6!!-!!S!&J!!!!`!N!J"!!!!!H)!!!$L!!!!-J"1)l!CYJ!!!"`!-J!!Fh4
+jE!!!!!S!J2rr!*!&6LCSD!3!:
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/TexEdit_2.0.hqx b/writerperfect/qa/unit/data/writer/libmwaw/pass/TexEdit_2.0.hqx
new file mode 100644
index 000000000..649b409af
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/TexEdit_2.0.hqx
@@ -0,0 +1,14 @@
+(This file must be converted with BinHex 4.0)
+:#h4PH(3b,R4PC'Pd!&4&@&483N)e!*!&8J!!!N+PF8%JFfeKE'`J9'9i,89NDA3
+JG'9iG!eLEfaN)'PdB@aTBb"eEQ4PFQaTEQ80-6JJF'pTER4c,#!a-L"`EfPZG(-
+03fKTBf&REb`J3fpeFQPPFJdi,!!!!3!!!!(Z!!!!lJ!!!&3JG'9iG!eLEfaN)'P
+dB@aTBb"eEQ4PFQaTEQ80-6JJF!YdCAKd-LjdC@4TG!)!!!"849K89%*#03#3#P4
+&@&483N)e!*!Bcl8f$3!!!&)!!!*#38029%&38%`&!*!')JE#!)!,!8&$6e4"8&"
+-"J#3"L)(3J%!#`&"3dp84NT64`%!N!BL#%)"!!X"38029%C+8dF#!*!')JP#!J!
+,!8&$6e4'5P0(!`#3"L),3J3!#`&"3dp84NT64`3!N!BL$d)!3!!!!0i!#`#3"3X
+!#3!%!!!!#3#3#4B!#`!*!!3"!!!*!*!*'J!,!!N!"!!!!!N!N!NE!!X!#3!%!J!
+!#3#3#5%!#`!*!!3!!!!*!*!*)J!,!!N!"!3!!!N!N!NV!!X!#3!%!!!!#3#3#5`
+!'!!5!!3!!!!5!*!*0`!3!!`!"!!!!!`!N!P"!"!!$!#3"3`!N!P+!!`!#J!@!!!
+!$!#3#3J!JJ"%!5)"q3!!!3!!!!(Z!!!!lJ!!!&3!9QM-'*`!!!!F!%B!!A0dH@`
+!!!!5Gh*MG!!!!"i$k!#3"eE0(!2S!!F!!!$L!&E,h!CcG(PXCA-'GfPZC'ph'r8
+!:
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/WriteNow_2.0 b/writerperfect/qa/unit/data/writer/libmwaw/pass/WriteNow_2.0
new file mode 100644
index 000000000..ce3f5d4ce
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/WriteNow_2.0
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/WriteNow_4.0 b/writerperfect/qa/unit/data/writer/libmwaw/pass/WriteNow_4.0
new file mode 100644
index 000000000..9ebe17ac7
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/WriteNow_4.0
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/WriterPlus b/writerperfect/qa/unit/data/writer/libmwaw/pass/WriterPlus
new file mode 100644
index 000000000..f95fa2882
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/WriterPlus
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libmwaw/pass/eDoc_2.0.hqx b/writerperfect/qa/unit/data/writer/libmwaw/pass/eDoc_2.0.hqx
new file mode 100644
index 000000000..d558aacb3
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libmwaw/pass/eDoc_2.0.hqx
@@ -0,0 +1,29 @@
+(This file must be converted with BinHex 4.0)
+:#A4PH(3a,Q9NB`"P4'pMC84M8J#3#!NeQdX!N!3"!!!!#-F!!!I(!!!!EQFd#!!
+!"@FJ#!!!"'F+BHBQ!'(L`801G4!BiB!3'1'!#A4PH(3a,Q9NB`)!!!"P4'pMC84
+M8J#3$'9%Ef0P4'05!*!Bcl8bT3#3"JNeDJlKL"!BiBJ3'1')%"KJ##3!B3$rG-&
+#d)$6`0148i*Qq'$%6R@!$R*PE'pMBA4PAhG[FQaN!!"d!#"I)"mLAfFS-JN#33!
+$C`J5`P1!C[*J'#)!j)PR"L,#8i&QqJ*!!!0J!K,#8FMrr%l3J!TD49*23P9'4N9
+5!*!'&,i!!3!!!Q)!!!*L!!!%3'l`BfZ!0QCSGQCjGjGiJ!"`F(J!!%N!N!!!CSL
+(J!Kj!!C`Gj!!#)LACJF'Q!F)J!L!"J!*!*!!")CPH)8'CfCjGfH*!!B!"iL!#!N
+!"`#3#T!!J!#3"i!!N!H!!*!-#3#3%*FH!!)M3fG`"J"hB!!!3!F!!!!(!!!!B!"
+`!*!&"`FL-PB'Ce"`VqD2PmkpEEUiilYAYeSl3(!5XJ3LYYJ+XEdF2aUak1[riB&
+B!&H+2`MCXqUH@HLR0R"9'c'['Y(MJR[Fm0krq8jG202,PPjm@LFZ@R,4+hdcq&'
+18qQ9&ldm9b+NDV(cBrf2kMFMbaGLr(!S4GMpP$1Gm(#LF-F8B+[k!5Z3!2VZVaD
+hS`#1`L1i)Ve)M`IMApZI,M%&%A0ZT)FFUJ+VDP1LH@R%`Blk$!#lPDeeCXG(4PT
+c81&0jLq3!'EpB@'"&f28SBBYSi86!)[#N@FPE""HCPAr,#T`LTS6d%K@3"40pH1
+m'2PLpUq6IPcjkFfMT#1I4lR*DmQmSQkRIi'YQ0'`)Zar+KKR@MK4-)RFL6Vmp#"
+b$EpD3*!!V5R3Y@0UaaCqVSTSk"d$D#MrFAV+L36kaie[f1,hdiTqiGNHSI1-[e$
+'X#,XG#KKKfMK4-JKp+3lYf%(T'jl%r@firb2CBRQP6SSjR[,pFFFI52h8)iiqDK
+Kbl4`SQNI@pLraRKGMFrl*CqqTpA,0iSY48e11M04m*RBe)VkTmqr-CVpBqfaZbh
+CATAjFN[5!VGMY!#3"Z[U9'KTFb"NEf0eE@9ZG#"hBA-JBh*PBA4PC#"eFfPZCb"
+dD'8JC8423kSJFfKKFQ9hBA*P)(0[CR4hBA*P,L"*G#"MB@iJBQ8JGQPPGf9N)'&
+ZC#"`FQPZG'9N)(9cD@jR)'9%6d-J8Q9KC'9b,#"K)'CbC@8JBfpYF'pZC@jd)'p
+Q)'9%6d-Z$3e'Eh)JE@pbC5"TEQC[FQeKG'P[EL`JH@pe)'0KEL"fDA0TG#"dD'8
+JC8423b"hC@)JFfPdC5"KG$S0D(4dF$S[,h"PFR0[,RGKEQ&NEfmZCR)[E@PMD'9
+X,R4[G@0SEh3[!!!!D!!!"%$2Y6+Q"%&MG'%!J!#3"3-B!Q3!BQXS!'*UB!"LDK3
+!N!3+G'9iG$%ZB@0dBE%!!3!"!!J!BQX-!'*UR!!!!!%+!!!%!!!#%!#3"!-B!Q3
+!!3#3"J*L!!!%3!!!!Q)!!!3#!!3)8'&XBA4TEQm!N2F(3fpeFQPPFJ#3q!G$D'P
+MB@G[!*$i"NGPEQ9fB3#3q`%!!!!)a`!!"mF!!!"Z!'*U$"Tb!!!!(!"Z!!0M8%P
+$!!!!)P088L!!!!!Z5@jQE`!!!$TP4'0'!!!!4J!"rrm!N!Lrmrrr)!!#CJ!)F$!
+!J2rr)!!$93"LDc!!J2rr!!!$`3"LD[J3M!:
diff --git a/writerperfect/qa/unit/data/writer/libstaroffice/fail/.gitignore b/writerperfect/qa/unit/data/writer/libstaroffice/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libstaroffice/fail/.gitignore
diff --git a/writerperfect/qa/unit/data/writer/libstaroffice/indeterminate/.gitignore b/writerperfect/qa/unit/data/writer/libstaroffice/indeterminate/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libstaroffice/indeterminate/.gitignore
diff --git a/writerperfect/qa/unit/data/writer/libstaroffice/pass/Writer_3.1.sdw b/writerperfect/qa/unit/data/writer/libstaroffice/pass/Writer_3.1.sdw
new file mode 100644
index 000000000..0884942a4
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libstaroffice/pass/Writer_3.1.sdw
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libwpd/fail/.gitignore b/writerperfect/qa/unit/data/writer/libwpd/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libwpd/fail/.gitignore
diff --git a/writerperfect/qa/unit/data/writer/libwpd/indeterminate/.gitignore b/writerperfect/qa/unit/data/writer/libwpd/indeterminate/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libwpd/indeterminate/.gitignore
diff --git a/writerperfect/qa/unit/data/writer/libwpd/pass/CVE-2007-1735-1.wpd b/writerperfect/qa/unit/data/writer/libwpd/pass/CVE-2007-1735-1.wpd
new file mode 100644
index 000000000..4d11b9379
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libwpd/pass/CVE-2007-1735-1.wpd
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libwpd/pass/CVE-2015-1759-1.wpd b/writerperfect/qa/unit/data/writer/libwpd/pass/CVE-2015-1759-1.wpd
new file mode 100644
index 000000000..9ff9a088d
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libwpd/pass/CVE-2015-1759-1.wpd
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libwpd/pass/CVE-2015-1760-1.wpd b/writerperfect/qa/unit/data/writer/libwpd/pass/CVE-2015-1760-1.wpd
new file mode 100644
index 000000000..23c8aa302
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libwpd/pass/CVE-2015-1760-1.wpd
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libwpd/pass/CVE-2015-1760-2.wpd b/writerperfect/qa/unit/data/writer/libwpd/pass/CVE-2015-1760-2.wpd
new file mode 100644
index 000000000..cca30a080
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libwpd/pass/CVE-2015-1760-2.wpd
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libwpd/pass/EDB-14344-1.wpd b/writerperfect/qa/unit/data/writer/libwpd/pass/EDB-14344-1.wpd
new file mode 100644
index 000000000..8d2e51df6
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libwpd/pass/EDB-14344-1.wpd
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libwpd/pass/WP1.wpd b/writerperfect/qa/unit/data/writer/libwpd/pass/WP1.wpd
new file mode 100644
index 000000000..7f635ad97
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libwpd/pass/WP1.wpd
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libwpd/pass/WP3.wpd b/writerperfect/qa/unit/data/writer/libwpd/pass/WP3.wpd
new file mode 100644
index 000000000..75f4924e8
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libwpd/pass/WP3.wpd
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libwpd/pass/WP4.wp b/writerperfect/qa/unit/data/writer/libwpd/pass/WP4.wp
new file mode 100644
index 000000000..6917b81e6
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libwpd/pass/WP4.wp
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libwpd/pass/WP5.wp b/writerperfect/qa/unit/data/writer/libwpd/pass/WP5.wp
new file mode 100644
index 000000000..45932176f
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libwpd/pass/WP5.wp
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libwpd/pass/WP6.wpd b/writerperfect/qa/unit/data/writer/libwpd/pass/WP6.wpd
new file mode 100644
index 000000000..dc8aceca5
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libwpd/pass/WP6.wpd
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libwps/fail/.gitignore b/writerperfect/qa/unit/data/writer/libwps/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libwps/fail/.gitignore
diff --git a/writerperfect/qa/unit/data/writer/libwps/indeterminate/.gitignore b/writerperfect/qa/unit/data/writer/libwps/indeterminate/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libwps/indeterminate/.gitignore
diff --git a/writerperfect/qa/unit/data/writer/libwps/pass/Word_5.0_DOS.doc b/writerperfect/qa/unit/data/writer/libwps/pass/Word_5.0_DOS.doc
new file mode 100644
index 000000000..5e5e45912
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libwps/pass/Word_5.0_DOS.doc
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libwps/pass/Works_2.00A_DOS.wps b/writerperfect/qa/unit/data/writer/libwps/pass/Works_2.00A_DOS.wps
new file mode 100644
index 000000000..4bccbbd18
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libwps/pass/Works_2.00A_DOS.wps
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libwps/pass/Works_3.0.wps b/writerperfect/qa/unit/data/writer/libwps/pass/Works_3.0.wps
new file mode 100644
index 000000000..74f46091e
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libwps/pass/Works_3.0.wps
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libwps/pass/Works_4.5.wps b/writerperfect/qa/unit/data/writer/libwps/pass/Works_4.5.wps
new file mode 100644
index 000000000..65c25a002
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libwps/pass/Works_4.5.wps
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libwps/pass/Works_5.0.wps b/writerperfect/qa/unit/data/writer/libwps/pass/Works_5.0.wps
new file mode 100644
index 000000000..97bb269f3
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libwps/pass/Works_5.0.wps
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libwps/pass/Works_6.0.wps b/writerperfect/qa/unit/data/writer/libwps/pass/Works_6.0.wps
new file mode 100644
index 000000000..d0a40c4c0
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libwps/pass/Works_6.0.wps
Binary files differ
diff --git a/writerperfect/qa/unit/data/writer/libwps/pass/Write_3.1.wri b/writerperfect/qa/unit/data/writer/libwps/pass/Write_3.1.wri
new file mode 100644
index 000000000..458482de0
--- /dev/null
+++ b/writerperfect/qa/unit/data/writer/libwps/pass/Write_3.1.wri
Binary files differ
diff --git a/writerperfect/qa/unit/stream.cxx b/writerperfect/qa/unit/stream.cxx
new file mode 100644
index 000000000..168967728
--- /dev/null
+++ b/writerperfect/qa/unit/stream.cxx
@@ -0,0 +1,16 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <cppunit/plugin/TestPlugIn.h>
+
+#include <sal/types.h>
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/qa/unit/wpftimport.cxx b/writerperfect/qa/unit/wpftimport.cxx
new file mode 100644
index 000000000..fe3bfa02f
--- /dev/null
+++ b/writerperfect/qa/unit/wpftimport.cxx
@@ -0,0 +1,29 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "wpftimport.hxx"
+
+#include <cppunit/plugin/TestPlugIn.h>
+
+#include <comphelper/seqstream.hxx>
+
+#include <rtl/ref.hxx>
+
+#include <sal/types.h>
+
+css::uno::Reference<css::io::XInputStream> createDummyInput()
+{
+ rtl::Reference<comphelper::SequenceInputStream> xDummyInput(
+ new comphelper::SequenceInputStream(css::uno::Sequence<sal_Int8>()));
+ return xDummyInput.get();
+}
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/qa/unit/wpftimport.hxx b/writerperfect/qa/unit/wpftimport.hxx
new file mode 100644
index 000000000..136c24d6c
--- /dev/null
+++ b/writerperfect/qa/unit/wpftimport.hxx
@@ -0,0 +1,33 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_QA_UNIT_WPFTIMPORT_HXX
+#define INCLUDED_WRITERPERFECT_QA_UNIT_WPFTIMPORT_HXX
+
+#include <com/sun/star/uno/Reference.hxx>
+
+namespace com
+{
+namespace sun
+{
+namespace star
+{
+namespace io
+{
+class XInputStream;
+}
+}
+}
+}
+
+css::uno::Reference<css::io::XInputStream> createDummyInput();
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/qa/unit/wpftqahelperdllapi.h b/writerperfect/qa/unit/wpftqahelperdllapi.h
new file mode 100644
index 000000000..9f19a2972
--- /dev/null
+++ b/writerperfect/qa/unit/wpftqahelperdllapi.h
@@ -0,0 +1,24 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_QA_UNIT_WPFTQAHELPERDLLAPI_H
+#define INCLUDED_WRITERPERFECT_QA_UNIT_WPFTQAHELPERDLLAPI_H
+
+#include <sal/types.h>
+
+#if defined(WPFTQAHELPER_DLLIMPLEMENTATION)
+#define WPFTQAHELPER_DLLPUBLIC SAL_DLLPUBLIC_EXPORT
+#else
+#define WPFTQAHELPER_DLLPUBLIC SAL_DLLPUBLIC_IMPORT
+#endif
+#define WPFTQAHELPER_DLLPRIVATE SAL_DLLPRIVATE
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/calc/MSWorksCalcImportFilter.cxx b/writerperfect/source/calc/MSWorksCalcImportFilter.cxx
new file mode 100644
index 000000000..521b7c0db
--- /dev/null
+++ b/writerperfect/source/calc/MSWorksCalcImportFilter.cxx
@@ -0,0 +1,471 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* MSWorksCalcImportFilter: Sets up the filter, and calls DocumentCollector
+ * to do the actual filtering
+ *
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <com/sun/star/awt/XWindow.hpp>
+#include <com/sun/star/container/XChild.hpp>
+#include <com/sun/star/sdbc/XResultSet.hpp>
+#include <com/sun/star/sdbc/XRow.hpp>
+#include <com/sun/star/ucb/XContent.hpp>
+#include <com/sun/star/ucb/XContentAccess.hpp>
+#include <sal/log.hxx>
+#include <comphelper/processfactory.hxx>
+#include <cppuhelper/supportsservice.hxx>
+#include <sfx2/passwd.hxx>
+#include <tools/urlobj.hxx>
+#include <ucbhelper/content.hxx>
+
+#include <libwps/libwps.h>
+
+#include <DocumentHandlerForOds.hxx>
+#include <WPFTEncodingDialog.hxx>
+#include <WPFTResMgr.hxx>
+#include "MSWorksCalcImportFilter.hxx"
+#include <strings.hrc>
+
+#include <iostream>
+#include <map>
+
+using namespace ::com::sun::star;
+
+namespace MSWorksCalcImportFilterInternal
+{
+/// returns the list of stream name present in a folder
+static uno::Reference<sdbc::XResultSet>
+getResultSet(const css::uno::Reference<css::ucb::XContent>& xPackageContent)
+{
+ try
+ {
+ if (xPackageContent.is())
+ {
+ ucbhelper::Content packageContent(xPackageContent,
+ uno::Reference<ucb::XCommandEnvironment>(),
+ comphelper::getProcessComponentContext());
+ uno::Sequence<OUString> lPropNames{ "Title" };
+ uno::Reference<sdbc::XResultSet> xResultSet(
+ packageContent.createCursor(lPropNames, ucbhelper::INCLUDE_DOCUMENTS_ONLY));
+ return xResultSet;
+ }
+ return uno::Reference<sdbc::XResultSet>();
+ }
+ catch (...)
+ {
+ SAL_WARN("writerperfect",
+ "ignoring Exception in MSWorksCalcImportFilterInternal:getResultSet");
+ return uno::Reference<sdbc::XResultSet>();
+ }
+}
+
+namespace
+{
+/** internal class used to create a structured RVNGInputStream from a list of path and their short names
+ */
+class FolderStream : public librevenge::RVNGInputStream
+{
+public:
+ //! constructor
+ explicit FolderStream(const css::uno::Reference<css::ucb::XContent>& xContent)
+ : librevenge::RVNGInputStream()
+ , m_xContent(xContent)
+ , m_nameToPathMap()
+ {
+ }
+
+ //! add a file
+ void addFile(OUString const& path, std::string const& shortName)
+ {
+ m_nameToPathMap[shortName] = path;
+ }
+ /**! reads numbytes data.
+
+ * \return a pointer to the read elements
+ */
+ const unsigned char* read(unsigned long, unsigned long&) override { return nullptr; }
+ //! returns actual offset position
+ long tell() override { return 0; }
+ /*! \brief seeks to an offset position, from actual, beginning or ending position
+ * \return 0 if ok
+ */
+ int seek(long, librevenge::RVNG_SEEK_TYPE) override { return 1; }
+ //! returns true if we are at the end of the section/file
+ bool isEnd() override { return true; }
+
+ /** returns true if the stream is ole
+
+ \sa returns always false*/
+ bool isStructured() override { return true; }
+ /** returns the number of sub streams.
+
+ \sa returns always 2*/
+ unsigned subStreamCount() override { return unsigned(m_nameToPathMap.size()); }
+ /** returns the ith sub streams name */
+ const char* subStreamName(unsigned id) override
+ {
+ if (m_nameToPathMap.size() < id)
+ return nullptr;
+
+ std::map<std::string, OUString>::const_iterator it = m_nameToPathMap.begin();
+ std::advance(it, id);
+ return it->first.c_str();
+ }
+ /** returns true if a substream with name exists */
+ bool existsSubStream(const char* name) override
+ {
+ return name && m_nameToPathMap.find(name) != m_nameToPathMap.end();
+ }
+ /** return a new stream for an OLE zone */
+ librevenge::RVNGInputStream* getSubStreamByName(const char* name) override
+ {
+ if (m_nameToPathMap.find(name) == m_nameToPathMap.end() || !m_xContent.is())
+ return nullptr;
+
+ try
+ {
+ const uno::Reference<sdbc::XResultSet> xResultSet = getResultSet(m_xContent);
+ if (xResultSet.is() && xResultSet->first())
+ {
+ const uno::Reference<ucb::XContentAccess> xContentAccess(xResultSet,
+ uno::UNO_QUERY_THROW);
+ const uno::Reference<sdbc::XRow> xRow(xResultSet, uno::UNO_QUERY_THROW);
+ OUString lPath = m_nameToPathMap.find(name)->second;
+ do
+ {
+ const OUString aTitle(xRow->getString(1));
+ if (aTitle != lPath)
+ continue;
+
+ const uno::Reference<ucb::XContent> xSubContent(xContentAccess->queryContent());
+ ucbhelper::Content aSubContent(xSubContent,
+ uno::Reference<ucb::XCommandEnvironment>(),
+ comphelper::getProcessComponentContext());
+ uno::Reference<io::XInputStream> xInputStream = aSubContent.openStream();
+ if (xInputStream.is())
+ return new writerperfect::WPXSvInputStream(xInputStream);
+ break;
+ } while (xResultSet->next());
+ }
+ }
+ catch (...)
+ {
+ SAL_WARN("writerperfect", "ignoring Exception in "
+ "MSWorksCalcImportFilterInternal::FolderStream::"
+ "getSubStreamByName");
+ }
+
+ return nullptr;
+ }
+ /** return a new stream for an OLE zone */
+ librevenge::RVNGInputStream* getSubStreamById(unsigned id) override
+ {
+ char const* name = subStreamName(id);
+ return name ? getSubStreamByName(name) : nullptr;
+ }
+
+private:
+ /// the main container
+ uno::Reference<ucb::XContent> m_xContent;
+ /// the map short name to path
+ std::map<std::string, OUString> m_nameToPathMap;
+ FolderStream(const FolderStream&) = delete;
+ FolderStream& operator=(const FolderStream&) = delete;
+};
+}
+}
+
+////////////////////////////////////////////////////////////
+bool MSWorksCalcImportFilter::doImportDocument(weld::Window* pParent,
+ librevenge::RVNGInputStream& rInput,
+ OdsGenerator& rGenerator,
+ utl::MediaDescriptor& mediaDescriptor)
+{
+ libwps::WPSKind kind = libwps::WPS_TEXT;
+ libwps::WPSCreator creator;
+ bool needEncoding;
+ const libwps::WPSConfidence confidence
+ = libwps::WPSDocument::isFileFormatSupported(&rInput, kind, creator, needEncoding);
+
+ if ((kind != libwps::WPS_SPREADSHEET && kind != libwps::WPS_DATABASE)
+ || (confidence == libwps::WPS_CONFIDENCE_NONE))
+ return false;
+ std::string fileEncoding;
+ if (needEncoding)
+ {
+ OUString encoding;
+ // first check if we can find the encoding in the filter options (headless mode)
+ mediaDescriptor[utl::MediaDescriptor::PROP_FILTEROPTIONS()] >>= encoding;
+ if (!encoding.isEmpty()) // TODO: check if the encoding string is valid
+ fileEncoding = encoding.toUtf8().getStr();
+ else
+ {
+ OUString title;
+ switch (creator)
+ {
+ case libwps::WPS_MSWORKS:
+ title = WpResId(STR_ENCODING_DIALOG_TITLE_MSWORKS);
+ encoding = "CP850";
+ break;
+ case libwps::WPS_LOTUS:
+ title = WpResId(STR_ENCODING_DIALOG_TITLE_LOTUS);
+ encoding = "CP437";
+ break;
+ case libwps::WPS_SYMPHONY:
+ title = WpResId(STR_ENCODING_DIALOG_TITLE_SYMPHONY);
+ encoding = "CP437";
+ break;
+ case libwps::WPS_QUATTRO_PRO:
+ title = WpResId(STR_ENCODING_DIALOG_TITLE_QUATTROPRO);
+ encoding = "CP437";
+ break;
+ case libwps::WPS_RESERVED_2:
+ title = WpResId(STR_ENCODING_DIALOG_TITLE_MSMULTIPLAN);
+ encoding = "CP437";
+ break;
+ default:
+ SAL_INFO("writerperfect", "unexpected creator: " << creator);
+ title = WpResId(STR_ENCODING_DIALOG_TITLE);
+ encoding = "CP437";
+ break;
+ }
+
+ fileEncoding = encoding.toUtf8().getStr(); // set default to the proposed encoding
+ try
+ {
+ writerperfect::WPFTEncodingDialog aDlg(pParent, title, encoding);
+ if (aDlg.run() == RET_OK)
+ {
+ if (!aDlg.GetEncoding().isEmpty())
+ fileEncoding = aDlg.GetEncoding().toUtf8().getStr();
+ }
+ // we can fail because we are in headless mode, the user has cancelled conversion, ...
+ else if (aDlg.hasUserCalledCancel())
+ return false;
+ }
+ catch (...)
+ {
+ SAL_WARN("writerperfect",
+ "ignoring Exception in MSWorksCalcImportFilter::doImportDocument");
+ }
+ }
+ }
+ OString aUtf8Passwd;
+ if (confidence == libwps::WPS_CONFIDENCE_SUPPORTED_ENCRYPTION)
+ {
+ OUString sPassword;
+ // now check if we can find the password in the properties
+ // (just in case, "soffice --headless" adds an option to send password)
+ mediaDescriptor[utl::MediaDescriptor::PROP_PASSWORD()] >>= sPassword;
+ if (!sPassword.isEmpty())
+ aUtf8Passwd = OUStringToOString(sPassword, RTL_TEXTENCODING_UTF8);
+ else
+ {
+ // ok, ask the user for a password
+ try
+ {
+ SfxPasswordDialog aPasswdDlg(pParent);
+ aPasswdDlg.SetMinLen(1);
+ if (!aPasswdDlg.run())
+ return false;
+ OUString aPasswd = aPasswdDlg.GetPassword();
+ aUtf8Passwd = OUStringToOString(aPasswd, RTL_TEXTENCODING_UTF8);
+ }
+ catch (...)
+ {
+ return false;
+ }
+ }
+ }
+ return libwps::WPS_OK
+ == libwps::WPSDocument::parse(&rInput, &rGenerator,
+ confidence == libwps::WPS_CONFIDENCE_SUPPORTED_ENCRYPTION
+ ? aUtf8Passwd.getStr()
+ : nullptr,
+ fileEncoding.c_str());
+}
+
+//XExtendedFilterDetection
+sal_Bool
+MSWorksCalcImportFilter::filter(const css::uno::Sequence<css::beans::PropertyValue>& rDescriptor)
+{
+ OUString sUrl;
+ css::uno::Reference<css::io::XInputStream> xInputStream;
+ css::uno::Reference<ucb::XContent> xContent;
+ css::uno::Reference<css::awt::XWindow> xDialogParent;
+
+ for (const auto& rValue : rDescriptor)
+ {
+ if (rValue.Name == "InputStream")
+ rValue.Value >>= xInputStream;
+ else if (rValue.Name == "UCBContent")
+ rValue.Value >>= xContent;
+ else if (rValue.Name == "FileName" || rValue.Name == "URL")
+ rValue.Value >>= sUrl;
+ else if (rValue.Name == "ParentWindow")
+ rValue.Value >>= xDialogParent;
+ }
+
+ if (!getXContext().is() || !xInputStream.is())
+ {
+ OSL_ASSERT(false);
+ return false;
+ }
+
+ // An XML import service: what we push sax messages to...
+ css::uno::Reference<css::xml::sax::XDocumentHandler> xInternalHandler(
+ getXContext()->getServiceManager()->createInstanceWithContext(
+ writerperfect::DocumentHandlerFor<OdsGenerator>::name(), getXContext()),
+ css::uno::UNO_QUERY_THROW);
+
+ // The XImporter sets up an empty target document for XDocumentHandler to write to...
+ css::uno::Reference<css::document::XImporter> xImporter(xInternalHandler, css::uno::UNO_QUERY);
+ xImporter->setTargetDocument(getTargetDocument());
+
+ // OO Graphics Handler: abstract class to handle document SAX messages, concrete implementation here
+ // writes to in-memory target doc
+ writerperfect::DocumentHandler aHandler(xInternalHandler);
+
+ writerperfect::WPXSvInputStream input(xInputStream);
+ OdsGenerator exporter;
+ exporter.addDocumentHandler(&aHandler, ODF_FLAT_XML);
+ doRegisterHandlers(exporter);
+
+ utl::MediaDescriptor aDescriptor(rDescriptor);
+ try
+ {
+ // time to check if the file is a WK3 file and a FM3 file is
+ // present
+ bool checkForFM3 = false;
+ if (input.seek(0, librevenge::RVNG_SEEK_SET) == 0 && xContent.is()
+ && INetURLObject(sUrl).getExtension().equalsIgnoreAsciiCase("WK3"))
+ {
+ // check if the file header corresponds to a .wk3 file
+ unsigned long numBytesRead;
+ const unsigned char* data = input.read(6, numBytesRead);
+ if (data && numBytesRead == 6 && data[0] == 0 && data[1] == 0 && data[2] == 0x1a
+ && data[3] == 0 && data[4] < 2 && data[5] == 0x10)
+ checkForFM3 = true;
+ }
+ if (checkForFM3)
+ {
+ // check if the format file exists
+ const css::uno::Reference<container::XChild> xChild(xContent, uno::UNO_QUERY);
+ if (xChild.is())
+ {
+ OUString sWM3Name;
+ OUString sFM3Name;
+ const css::uno::Reference<ucb::XContent> xPackageContent(xChild->getParent(),
+ uno::UNO_QUERY);
+ uno::Reference<sdbc::XResultSet> xResultSet
+ = MSWorksCalcImportFilterInternal::getResultSet(xPackageContent);
+ if (xResultSet.is() && xResultSet->first())
+ {
+ const uno::Reference<ucb::XContentAccess> xContentAccess(xResultSet,
+ uno::UNO_QUERY_THROW);
+ const uno::Reference<sdbc::XRow> xRow(xResultSet, uno::UNO_QUERY_THROW);
+ INetURLObject aTmpUrl(sUrl);
+ sWM3Name = aTmpUrl.getName(INetURLObject::LAST_SEGMENT, true,
+ INetURLObject::DecodeMechanism::WithCharset);
+ aTmpUrl.setExtension("FM3");
+ const OUString& sTestFM3Name
+ = aTmpUrl.getName(INetURLObject::LAST_SEGMENT, true,
+ INetURLObject::DecodeMechanism::WithCharset);
+ do
+ {
+ const OUString& aTitle(xRow->getString(1));
+ if (aTitle.equalsIgnoreAsciiCase(sTestFM3Name))
+ sFM3Name = aTitle;
+ } while (xResultSet->next() && sFM3Name.isEmpty());
+ }
+ if (!sFM3Name.isEmpty())
+ {
+ MSWorksCalcImportFilterInternal::FolderStream structuredInput(xPackageContent);
+ structuredInput.addFile(sWM3Name, "WK3");
+ structuredInput.addFile(sFM3Name, "FM3");
+
+ libwps::WPSKind kind = libwps::WPS_TEXT;
+ libwps::WPSCreator creator;
+ bool needEncoding;
+ const libwps::WPSConfidence confidence
+ = libwps::WPSDocument::isFileFormatSupported(&structuredInput, kind,
+ creator, needEncoding);
+ if (confidence != libwps::WPS_CONFIDENCE_NONE)
+ return doImportDocument(Application::GetFrameWeld(xDialogParent),
+ structuredInput, exporter, aDescriptor);
+ }
+ }
+ }
+ }
+ catch (...)
+ {
+ }
+
+ return doImportDocument(Application::GetFrameWeld(xDialogParent), input, exporter, aDescriptor);
+}
+
+bool MSWorksCalcImportFilter::doDetectFormat(librevenge::RVNGInputStream& rInput,
+ OUString& rTypeName)
+{
+ libwps::WPSKind kind = libwps::WPS_TEXT;
+ libwps::WPSCreator creator;
+ bool needEncoding;
+ const libwps::WPSConfidence confidence
+ = libwps::WPSDocument::isFileFormatSupported(&rInput, kind, creator, needEncoding);
+
+ if ((kind == libwps::WPS_SPREADSHEET || kind == libwps::WPS_DATABASE)
+ && confidence != libwps::WPS_CONFIDENCE_NONE)
+ {
+ switch (creator)
+ {
+ case libwps::WPS_MSWORKS:
+ rTypeName = "calc_MS_Works_Document";
+ break;
+ case libwps::WPS_LOTUS:
+ case libwps::WPS_SYMPHONY:
+ rTypeName = "calc_WPS_Lotus_Document";
+ break;
+ case libwps::WPS_QUATTRO_PRO:
+ rTypeName = "calc_WPS_QPro_Document";
+ break;
+ case libwps::WPS_RESERVED_2:
+ rTypeName = "calc_MS_Multiplan";
+ break;
+ default:
+ break;
+ }
+ }
+
+ return !rTypeName.isEmpty();
+}
+
+void MSWorksCalcImportFilter::doRegisterHandlers(OdsGenerator&) {}
+
+// XServiceInfo
+OUString SAL_CALL MSWorksCalcImportFilter::getImplementationName()
+{
+ return "com.sun.star.comp.Calc.MSWorksCalcImportFilter";
+}
+
+sal_Bool SAL_CALL MSWorksCalcImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+css::uno::Sequence<OUString> SAL_CALL MSWorksCalcImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Calc_MSWorksCalcImportFilter_get_implementation(
+ css::uno::XComponentContext* const context, const css::uno::Sequence<css::uno::Any>&)
+{
+ return cppu::acquire(new MSWorksCalcImportFilter(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/calc/MSWorksCalcImportFilter.hxx b/writerperfect/source/calc/MSWorksCalcImportFilter.hxx
new file mode 100644
index 000000000..82cf76763
--- /dev/null
+++ b/writerperfect/source/calc/MSWorksCalcImportFilter.hxx
@@ -0,0 +1,48 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_CALC_MSWORKSCALCIMPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_CALC_MSWORKSCALCIMPORTFILTER_HXX
+
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+#include <DocumentHandlerForOds.hxx>
+#include <ImportFilter.hxx>
+
+/* This component will be instantiated for both import or export. Whether it calls
+ * setSourceDocument or setTargetDocument determines which Impl function the filter
+ * member calls */
+class MSWorksCalcImportFilter : public writerperfect::ImportFilter<OdsGenerator>
+{
+public:
+ explicit MSWorksCalcImportFilter(
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdsGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+ //XFilter
+ virtual sal_Bool SAL_CALL
+ filter(const css::uno::Sequence<css::beans::PropertyValue>& rDescriptor) override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
+ OdsGenerator& rGenerator, utl::MediaDescriptor&) override;
+ virtual void doRegisterHandlers(OdsGenerator& rGenerator) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/calc/MWAWCalcImportFilter.cxx b/writerperfect/source/calc/MWAWCalcImportFilter.cxx
new file mode 100644
index 000000000..186084b17
--- /dev/null
+++ b/writerperfect/source/calc/MWAWCalcImportFilter.cxx
@@ -0,0 +1,124 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* MWAWCalcImportFilter: Sets up the filter, and calls DocumentCollector
+ * to do the actual filtering
+ *
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <cppuhelper/supportsservice.hxx>
+
+#include <libmwaw/libmwaw.hxx>
+
+#include "MWAWCalcImportFilter.hxx"
+
+static bool handleEmbeddedMWAWGraphicObject(const librevenge::RVNGBinaryData& data,
+ OdfDocumentHandler* pHandler,
+ const OdfStreamType streamType)
+{
+ OdgGenerator exporter;
+ exporter.addDocumentHandler(pHandler, streamType);
+ return MWAWDocument::decodeGraphic(data, &exporter);
+}
+
+static bool handleEmbeddedMWAWSpreadsheetObject(const librevenge::RVNGBinaryData& data,
+ OdfDocumentHandler* pHandler,
+ const OdfStreamType streamType)
+{
+ OdsGenerator exporter;
+ exporter.addDocumentHandler(pHandler, streamType);
+ return MWAWDocument::decodeSpreadsheet(data, &exporter);
+}
+
+bool MWAWCalcImportFilter::doImportDocument(weld::Window*, librevenge::RVNGInputStream& rInput,
+ OdsGenerator& rGenerator, utl::MediaDescriptor&)
+{
+ return MWAWDocument::MWAW_R_OK == MWAWDocument::parse(&rInput, &rGenerator);
+}
+
+bool MWAWCalcImportFilter::doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName)
+{
+ rTypeName.clear();
+
+ MWAWDocument::Type docType = MWAWDocument::MWAW_T_UNKNOWN;
+ MWAWDocument::Kind docKind = MWAWDocument::MWAW_K_UNKNOWN;
+ const MWAWDocument::Confidence confidence
+ = MWAWDocument::isFileFormatSupported(&rInput, docType, docKind);
+
+ if (confidence == MWAWDocument::MWAW_C_EXCELLENT)
+ {
+ switch (docKind)
+ {
+ case MWAWDocument::MWAW_K_DATABASE:
+ switch (docType)
+ {
+ case MWAWDocument::MWAW_T_CLARISWORKS:
+ rTypeName = "calc_ClarisWorks";
+ break;
+ case MWAWDocument::MWAW_T_MICROSOFTWORKS:
+ rTypeName = "calc_Mac_Works";
+ break;
+ default:
+ rTypeName = "MWAW_Database";
+ break;
+ }
+ break;
+ case MWAWDocument::MWAW_K_SPREADSHEET:
+ switch (docType)
+ {
+ case MWAWDocument::MWAW_T_CLARISRESOLVE:
+ rTypeName = "calc_Claris_Resolve";
+ break;
+ case MWAWDocument::MWAW_T_CLARISWORKS:
+ rTypeName = "calc_ClarisWorks";
+ break;
+ case MWAWDocument::MWAW_T_MICROSOFTWORKS:
+ rTypeName = "calc_Mac_Works";
+ break;
+ default:
+ rTypeName = "MWAW_Spreadsheet";
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ return !rTypeName.isEmpty();
+}
+
+void MWAWCalcImportFilter::doRegisterHandlers(OdsGenerator& rGenerator)
+{
+ rGenerator.registerEmbeddedObjectHandler("image/mwaw-odg", &handleEmbeddedMWAWGraphicObject);
+ rGenerator.registerEmbeddedObjectHandler("image/mwaw-ods",
+ &handleEmbeddedMWAWSpreadsheetObject);
+}
+
+// XServiceInfo
+OUString SAL_CALL MWAWCalcImportFilter::getImplementationName()
+{
+ return "com.sun.star.comp.Calc.MWAWCalcImportFilter";
+}
+
+sal_Bool SAL_CALL MWAWCalcImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+css::uno::Sequence<OUString> SAL_CALL MWAWCalcImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Calc_MWAWCalcImportFilter_get_implementation(
+ css::uno::XComponentContext* const context, const css::uno::Sequence<css::uno::Any>&)
+{
+ return cppu::acquire(new MWAWCalcImportFilter(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/calc/MWAWCalcImportFilter.hxx b/writerperfect/source/calc/MWAWCalcImportFilter.hxx
new file mode 100644
index 000000000..97cfc1891
--- /dev/null
+++ b/writerperfect/source/calc/MWAWCalcImportFilter.hxx
@@ -0,0 +1,43 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_CALC_MWAWCALCIMPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_CALC_MWAWCALCIMPORTFILTER_HXX
+
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+#include <DocumentHandlerForOds.hxx>
+#include <ImportFilter.hxx>
+
+/* This component will be instantiated for both import or export. Whether it calls
+ * setSourceDocument or setTargetDocument determines which Impl function the filter
+ * member calls */
+class MWAWCalcImportFilter : public writerperfect::ImportFilter<OdsGenerator>
+{
+public:
+ explicit MWAWCalcImportFilter(const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdsGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
+ OdsGenerator& rGenerator, utl::MediaDescriptor&) override;
+ virtual void doRegisterHandlers(OdsGenerator& rGenerator) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/calc/NumbersImportFilter.cxx b/writerperfect/source/calc/NumbersImportFilter.cxx
new file mode 100644
index 000000000..813684361
--- /dev/null
+++ b/writerperfect/source/calc/NumbersImportFilter.cxx
@@ -0,0 +1,65 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* NumbersImportFilter: Sets up the filter, and calls DocumentCollector
+ * to do the actual filtering
+ *
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <libetonyek/libetonyek.h>
+
+#include <cppuhelper/supportsservice.hxx>
+
+#include "NumbersImportFilter.hxx"
+
+using libetonyek::EtonyekDocument;
+
+bool NumbersImportFilter::doImportDocument(weld::Window*, librevenge::RVNGInputStream& rInput,
+ OdsGenerator& rGenerator, utl::MediaDescriptor&)
+{
+ return EtonyekDocument::parse(&rInput, &rGenerator);
+}
+
+bool NumbersImportFilter::doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName)
+{
+ EtonyekDocument::Type type = EtonyekDocument::TYPE_UNKNOWN;
+ const EtonyekDocument::Confidence confidence = EtonyekDocument::isSupported(&rInput, &type);
+ if ((confidence == EtonyekDocument::CONFIDENCE_EXCELLENT)
+ && (type == EtonyekDocument::TYPE_NUMBERS))
+ {
+ rTypeName = "calc_AppleNumbers";
+ return true;
+ }
+
+ return false;
+}
+
+void NumbersImportFilter::doRegisterHandlers(OdsGenerator&) {}
+
+// XServiceInfo
+OUString SAL_CALL NumbersImportFilter::getImplementationName()
+{
+ return "org.libreoffice.comp.Calc.NumbersImportFilter";
+}
+
+sal_Bool SAL_CALL NumbersImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+css::uno::Sequence<OUString> SAL_CALL NumbersImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+org_libreoffice_comp_Calc_NumbersImportFilter_get_implementation(
+ css::uno::XComponentContext* const context, const css::uno::Sequence<css::uno::Any>&)
+{
+ return cppu::acquire(new NumbersImportFilter(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/calc/NumbersImportFilter.hxx b/writerperfect/source/calc/NumbersImportFilter.hxx
new file mode 100644
index 000000000..9bbbc174b
--- /dev/null
+++ b/writerperfect/source/calc/NumbersImportFilter.hxx
@@ -0,0 +1,43 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_NUMBERSIMPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_NUMBERSIMPORTFILTER_HXX
+
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+#include <DocumentHandlerForOds.hxx>
+#include <ImportFilter.hxx>
+
+/* This component will be instantiated for both import or export. Whether it calls
+ * setSourceDocument or setTargetDocument determines which Impl function the filter
+ * member calls */
+class NumbersImportFilter : public writerperfect::ImportFilter<OdsGenerator>
+{
+public:
+ explicit NumbersImportFilter(const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdsGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
+ OdsGenerator& rGenerator, utl::MediaDescriptor&) override;
+ virtual void doRegisterHandlers(OdsGenerator& rGenerator) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/calc/StarOfficeCalcImportFilter.cxx b/writerperfect/source/calc/StarOfficeCalcImportFilter.cxx
new file mode 100644
index 000000000..de7e30e44
--- /dev/null
+++ b/writerperfect/source/calc/StarOfficeCalcImportFilter.cxx
@@ -0,0 +1,99 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <cppuhelper/supportsservice.hxx>
+
+#include <libstaroffice/libstaroffice.hxx>
+
+#include "StarOfficeCalcImportFilter.hxx"
+
+using com::sun::star::uno::Sequence;
+using com::sun::star::uno::XComponentContext;
+using com::sun::star::uno::XInterface;
+
+static bool handleEmbeddedSTOFFGraphicObject(const librevenge::RVNGBinaryData& data,
+ OdfDocumentHandler* pHandler,
+ const OdfStreamType streamType)
+{
+ OdgGenerator exporter;
+ exporter.addDocumentHandler(pHandler, streamType);
+ return STOFFDocument::decodeGraphic(data, &exporter);
+}
+
+static bool handleEmbeddedSTOFFSpreadsheetObject(const librevenge::RVNGBinaryData& data,
+ OdfDocumentHandler* pHandler,
+ const OdfStreamType streamType)
+{
+ OdsGenerator exporter;
+ exporter.addDocumentHandler(pHandler, streamType);
+ return STOFFDocument::decodeSpreadsheet(data, &exporter);
+}
+
+bool StarOfficeCalcImportFilter::doImportDocument(weld::Window*,
+ librevenge::RVNGInputStream& rInput,
+ OdsGenerator& rGenerator, utl::MediaDescriptor&)
+{
+ return STOFFDocument::STOFF_R_OK == STOFFDocument::parse(&rInput, &rGenerator);
+}
+
+bool StarOfficeCalcImportFilter::doDetectFormat(librevenge::RVNGInputStream& rInput,
+ OUString& rTypeName)
+{
+ rTypeName.clear();
+ STOFFDocument::Kind docKind = STOFFDocument::STOFF_K_UNKNOWN;
+ const STOFFDocument::Confidence confidence
+ = STOFFDocument::isFileFormatSupported(&rInput, docKind);
+ if (confidence == STOFFDocument::STOFF_C_EXCELLENT
+ || confidence == STOFFDocument::STOFF_C_SUPPORTED_ENCRYPTION)
+ {
+ switch (docKind)
+ {
+ case STOFFDocument::STOFF_K_DATABASE:
+ case STOFFDocument::STOFF_K_SPREADSHEET:
+ rTypeName = "StarOffice_Spreadsheet";
+ break;
+ default:
+ break;
+ }
+ }
+
+ return !rTypeName.isEmpty();
+}
+
+void StarOfficeCalcImportFilter::doRegisterHandlers(OdsGenerator& rGenerator)
+{
+ rGenerator.registerEmbeddedObjectHandler("image/stoff-odg", &handleEmbeddedSTOFFGraphicObject);
+ rGenerator.registerEmbeddedObjectHandler("image/stoff-ods",
+ &handleEmbeddedSTOFFSpreadsheetObject);
+}
+
+// XServiceInfo
+OUString SAL_CALL StarOfficeCalcImportFilter::getImplementationName()
+{
+ return "org.libreoffice.comp.Calc.StarOfficeCalcImportFilter";
+}
+
+sal_Bool SAL_CALL StarOfficeCalcImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+Sequence<OUString> SAL_CALL StarOfficeCalcImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+org_libreoffice_comp_Calc_StarOfficeCalcImportFilter_get_implementation(
+ css::uno::XComponentContext* const context, const css::uno::Sequence<css::uno::Any>&)
+{
+ return cppu::acquire(new StarOfficeCalcImportFilter(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/calc/StarOfficeCalcImportFilter.hxx b/writerperfect/source/calc/StarOfficeCalcImportFilter.hxx
new file mode 100644
index 000000000..bef0e2cef
--- /dev/null
+++ b/writerperfect/source/calc/StarOfficeCalcImportFilter.hxx
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_CALC_STAROFFICECALCIMPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_CALC_STAROFFICECALCIMPORTFILTER_HXX
+
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+#include <DocumentHandlerForOds.hxx>
+#include <ImportFilter.hxx>
+
+/* This component will be instantiated for both import or export. Whether it calls
+ * setSourceDocument or setTargetDocument determines which Impl function the filter
+ * member calls */
+class StarOfficeCalcImportFilter : public writerperfect::ImportFilter<OdsGenerator>
+{
+public:
+ explicit StarOfficeCalcImportFilter(
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdsGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
+ OdsGenerator& rGenerator, utl::MediaDescriptor&) override;
+ virtual void doRegisterHandlers(OdsGenerator& rGenerator) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/calc/wpftcalc.component b/writerperfect/source/calc/wpftcalc.component
new file mode 100644
index 000000000..404d09b6c
--- /dev/null
+++ b/writerperfect/source/calc/wpftcalc.component
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+-->
+<component loader="com.sun.star.loader.SharedLibrary" environment="@CPPU_ENV@"
+ xmlns="http://openoffice.org/2010/uno-components">
+ <implementation name="com.sun.star.comp.Calc.MSWorksCalcImportFilter"
+ constructor="com_sun_star_comp_Calc_MSWorksCalcImportFilter_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ <service name="com.sun.star.document.ExtendedTypeDetection"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Calc.MWAWCalcImportFilter"
+ constructor="com_sun_star_comp_Calc_MWAWCalcImportFilter_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ <service name="com.sun.star.document.ExtendedTypeDetection"/>
+ </implementation>
+ <implementation name="org.libreoffice.comp.Calc.NumbersImportFilter"
+ constructor="org_libreoffice_comp_Calc_NumbersImportFilter_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ <service name="com.sun.star.document.ExtendedTypeDetection"/>
+ </implementation>
+ <implementation name="org.libreoffice.comp.Calc.StarOfficeCalcImportFilter"
+ constructor="org_libreoffice_comp_Calc_StarOfficeCalcImportFilter_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ <service name="com.sun.star.document.ExtendedTypeDetection"/>
+ </implementation>
+</component>
diff --git a/writerperfect/source/common/DirectoryStream.cxx b/writerperfect/source/common/DirectoryStream.cxx
new file mode 100644
index 000000000..19ec454b2
--- /dev/null
+++ b/writerperfect/source/common/DirectoryStream.cxx
@@ -0,0 +1,221 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* writerperfect
+ * Version: MPL 2.0 / LGPLv2.1+
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * Major Contributor(s):
+ * Copyright (C) 2007 Fridrich Strba (fridrich.strba@bluewin.ch)
+ *
+ * For minor contributions see the git repository.
+ *
+ * Alternatively, the contents of this file may be used under the terms
+ * of the GNU Lesser General Public License Version 2.1 or later
+ * (LGPLv2.1+), in which case the provisions of the LGPLv2.1+ are
+ * applicable instead of those above.
+ *
+ * For further information visit http://libwpd.sourceforge.net
+ */
+
+#include <memory>
+#include <com/sun/star/container/XChild.hpp>
+#include <com/sun/star/io/XInputStream.hpp>
+#include <com/sun/star/sdbc/XResultSet.hpp>
+#include <com/sun/star/sdbc/XRow.hpp>
+#include <com/sun/star/ucb/XContent.hpp>
+#include <com/sun/star/ucb/XContentAccess.hpp>
+#include <com/sun/star/ucb/XCommandEnvironment.hpp>
+
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/uno/Sequence.hxx>
+
+#include <comphelper/processfactory.hxx>
+
+#include <rtl/ustring.hxx>
+
+#include <ucbhelper/content.hxx>
+
+#include <DirectoryStream.hxx>
+#include <WPXSvInputStream.hxx>
+
+namespace io = com::sun::star::io;
+namespace sdbc = com::sun::star::sdbc;
+namespace ucb = com::sun::star::ucb;
+namespace uno = com::sun::star::uno;
+
+namespace writerperfect
+{
+namespace
+{
+uno::Reference<io::XInputStream> findStream(ucbhelper::Content& rContent, const OUString& rName)
+{
+ uno::Reference<io::XInputStream> xInputStream;
+
+ uno::Sequence<OUString> lPropNames{ "Title" };
+ try
+ {
+ const uno::Reference<sdbc::XResultSet> xResultSet(
+ rContent.createCursor(lPropNames, ucbhelper::INCLUDE_DOCUMENTS_ONLY));
+ if (xResultSet->first())
+ {
+ const uno::Reference<ucb::XContentAccess> xContentAccess(xResultSet,
+ uno::UNO_QUERY_THROW);
+ const uno::Reference<sdbc::XRow> xRow(xResultSet, uno::UNO_QUERY_THROW);
+ do
+ {
+ const OUString aTitle(xRow->getString(1));
+ if (aTitle == rName)
+ {
+ const uno::Reference<ucb::XContent> xSubContent(xContentAccess->queryContent());
+ ucbhelper::Content aSubContent(xSubContent,
+ uno::Reference<ucb::XCommandEnvironment>(),
+ comphelper::getProcessComponentContext());
+ xInputStream = aSubContent.openStream();
+ break;
+ }
+ } while (xResultSet->next());
+ }
+ }
+ catch (const uno::RuntimeException&)
+ {
+ // ignore
+ }
+ catch (const uno::Exception&)
+ {
+ // ignore
+ }
+
+ return xInputStream;
+}
+}
+
+struct DirectoryStream::Impl
+{
+ explicit Impl(const uno::Reference<ucb::XContent>& rxContent);
+
+ uno::Reference<ucb::XContent> xContent;
+};
+
+DirectoryStream::Impl::Impl(const uno::Reference<ucb::XContent>& rxContent)
+ : xContent(rxContent)
+{
+}
+
+DirectoryStream::DirectoryStream(const css::uno::Reference<css::ucb::XContent>& xContent)
+ : m_pImpl(isDirectory(xContent) ? new Impl(xContent) : nullptr)
+{
+}
+
+DirectoryStream::~DirectoryStream() {}
+
+bool DirectoryStream::isDirectory(const css::uno::Reference<css::ucb::XContent>& xContent)
+{
+ try
+ {
+ if (!xContent.is())
+ return false;
+
+ ucbhelper::Content aContent(xContent, uno::Reference<ucb::XCommandEnvironment>(),
+ comphelper::getProcessComponentContext());
+ return aContent.isFolder();
+ }
+ catch (...)
+ {
+ return false;
+ }
+}
+
+std::unique_ptr<DirectoryStream>
+DirectoryStream::createForParent(const css::uno::Reference<css::ucb::XContent>& xContent)
+{
+ try
+ {
+ if (!xContent.is())
+ return nullptr;
+
+ std::unique_ptr<DirectoryStream> pDir;
+
+ const uno::Reference<css::container::XChild> xChild(xContent, uno::UNO_QUERY);
+ if (xChild.is())
+ {
+ const uno::Reference<ucb::XContent> xDirContent(xChild->getParent(), uno::UNO_QUERY);
+ if (xDirContent.is())
+ {
+ pDir = std::make_unique<DirectoryStream>(xDirContent);
+ if (!pDir->isStructured())
+ pDir.reset();
+ }
+ }
+
+ return pDir;
+ }
+ catch (...)
+ {
+ return nullptr;
+ }
+}
+
+css::uno::Reference<css::ucb::XContent> DirectoryStream::getContent() const
+{
+ if (!m_pImpl)
+ return css::uno::Reference<css::ucb::XContent>();
+ return m_pImpl->xContent;
+}
+
+bool DirectoryStream::isStructured() { return m_pImpl != nullptr; }
+
+unsigned DirectoryStream::subStreamCount()
+{
+ // TODO: implement me
+ return 0;
+}
+
+const char* DirectoryStream::subStreamName(unsigned /* id */)
+{
+ // TODO: implement me
+ return nullptr;
+}
+
+bool DirectoryStream::existsSubStream(const char* /* name */)
+{
+ // TODO: implement me
+ return false;
+}
+
+librevenge::RVNGInputStream* DirectoryStream::getSubStreamByName(const char* const pName)
+{
+ if (!m_pImpl)
+ return nullptr;
+
+ ucbhelper::Content aContent(m_pImpl->xContent, uno::Reference<ucb::XCommandEnvironment>(),
+ comphelper::getProcessComponentContext());
+ const uno::Reference<io::XInputStream> xInputStream(
+ findStream(aContent, OUString::createFromAscii(pName)));
+ if (xInputStream.is())
+ return new WPXSvInputStream(xInputStream);
+
+ return nullptr;
+}
+
+librevenge::RVNGInputStream* DirectoryStream::getSubStreamById(unsigned /* id */)
+{
+ // TODO: implement me
+ return nullptr;
+}
+
+const unsigned char* DirectoryStream::read(unsigned long, unsigned long& nNumBytesRead)
+{
+ nNumBytesRead = 0;
+ return nullptr;
+}
+
+int DirectoryStream::seek(long, librevenge::RVNG_SEEK_TYPE) { return -1; }
+
+long DirectoryStream::tell() { return 0; }
+
+bool DirectoryStream::isEnd() { return true; }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/common/DocumentHandler.cxx b/writerperfect/source/common/DocumentHandler.cxx
new file mode 100644
index 000000000..35aa49181
--- /dev/null
+++ b/writerperfect/source/common/DocumentHandler.cxx
@@ -0,0 +1,182 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * For further information visit http://libwpd.sourceforge.net
+ */
+
+#include <DocumentHandler.hxx>
+
+#include <string.h>
+
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/xml/sax/XDocumentHandler.hpp>
+#include <com/sun/star/xml/sax/XAttributeList.hpp>
+
+#include <xmloff/attrlist.hxx>
+#include <xmloff/xmlimp.hxx>
+
+namespace writerperfect
+{
+static const unsigned char librvng_utf8_skip_data[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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 1, 1 };
+
+static const char* librvng_utf8_next_char(const char* p)
+{
+ return p + librvng_utf8_skip_data[*reinterpret_cast<unsigned char const*>(p)];
+}
+
+static void unescapeXML(const char* s, const unsigned long sz, librevenge::RVNGString& res)
+{
+ const char* p = s;
+ const char* const end = p + sz;
+ while (p != end)
+ {
+ const char* const next = librvng_utf8_next_char(p);
+ if (next > end)
+ {
+ // oops, the string is invalid
+ break;
+ }
+ if (p + 4 <= end && p + 1 == next && *p == '&')
+ {
+ // look for &amp; , &lt; , &gt; , &apos; , &quot;
+ bool escapedChar = false;
+ switch (*(p + 1))
+ {
+ case 'a':
+ if (p + 5 <= end && strncmp(p, "&amp;", 5) == 0)
+ {
+ res.append('&');
+ p += 5;
+ escapedChar = true;
+ }
+ else if (p + 6 <= end && strncmp(p, "&apos;", 6) == 0)
+ {
+ res.append('\'');
+ p += 6;
+ escapedChar = true;
+ }
+ break;
+ case 'g':
+ if (strncmp(p, "&gt;", 4) == 0)
+ {
+ res.append('>');
+ p += 4;
+ escapedChar = true;
+ }
+ break;
+ case 'l':
+ if (strncmp(p, "&lt;", 4) == 0)
+ {
+ res.append('<');
+ p += 4;
+ escapedChar = true;
+ }
+ break;
+ case 'q':
+ if (p + 6 <= end && strncmp(p, "&quot;", 6) == 0)
+ {
+ res.append('"');
+ p += 6;
+ escapedChar = true;
+ }
+ break;
+ default:
+ break;
+ }
+ if (escapedChar)
+ continue;
+ }
+
+ while (p != next)
+ {
+ res.append(*p);
+ ++p;
+ }
+ p = next;
+ }
+}
+
+using com::sun::star::uno::Reference;
+using com::sun::star::xml::sax::XAttributeList;
+using com::sun::star::xml::sax::XDocumentHandler;
+
+DocumentHandler::DocumentHandler(Reference<XDocumentHandler> const& xHandler)
+ : mxHandler(xHandler)
+{
+ if (SvXMLImport* pFastHandler = dynamic_cast<SvXMLImport*>(mxHandler.get()))
+ mxHandler.set(new SvXMLLegacyToFastDocHandler(pFastHandler));
+}
+
+void DocumentHandler::startDocument() { mxHandler->startDocument(); }
+
+void DocumentHandler::endDocument() { mxHandler->endDocument(); }
+
+void DocumentHandler::startElement(const char* psName,
+ const librevenge::RVNGPropertyList& xPropList)
+{
+ SvXMLAttributeList* pAttrList = new SvXMLAttributeList();
+ Reference<XAttributeList> xAttrList(pAttrList);
+ librevenge::RVNGPropertyList::Iter i(xPropList);
+ for (i.rewind(); i.next();)
+ {
+ // filter out librevenge elements
+ if (strncmp(i.key(), "librevenge", 10) != 0)
+ {
+ size_t keyLength = strlen(i.key());
+ OUString sName(i.key(), keyLength, RTL_TEXTENCODING_UTF8);
+ OUString sValue(i()->getStr().cstr(), i()->getStr().len(), RTL_TEXTENCODING_UTF8);
+
+ // libodfgen xml-encodes some attribute's value, so check if the value is encoded or not
+ for (int j = 0; j < 9; ++j)
+ {
+ // list of the encoded attributes followed by their lengths
+ static char const* listEncoded[9]
+ = { "draw:name", "svg:font-family", "style:condition",
+ "style:num-prefix", "style:num-suffix", "table:formula",
+ "text:bullet-char", "text:label", "xlink:href" };
+ static size_t const listEncodedLength[9] = { 9, 15, 15, 16, 16, 13, 16, 10, 10 };
+ if (keyLength == listEncodedLength[j]
+ && strncmp(i.key(), listEncoded[j], keyLength) == 0)
+ {
+ librevenge::RVNGString decodedValue("");
+ unescapeXML(i()->getStr().cstr(),
+ static_cast<unsigned long>(i()->getStr().len()), decodedValue);
+ sValue
+ = OUString(decodedValue.cstr(), decodedValue.len(), RTL_TEXTENCODING_UTF8);
+ break;
+ }
+ }
+ pAttrList->AddAttribute(sName, sValue);
+ }
+ }
+
+ OUString sElementName(psName, strlen(psName), RTL_TEXTENCODING_UTF8);
+ mxHandler->startElement(sElementName, xAttrList);
+}
+
+void DocumentHandler::endElement(const char* psName)
+{
+ OUString sElementName(psName, strlen(psName), RTL_TEXTENCODING_UTF8);
+ mxHandler->endElement(sElementName);
+}
+
+void DocumentHandler::characters(const librevenge::RVNGString& sCharacters)
+{
+ OUString sCharU16(sCharacters.cstr(), strlen(sCharacters.cstr()), RTL_TEXTENCODING_UTF8);
+ mxHandler->characters(sCharU16);
+}
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/common/WPFTEncodingDialog.cxx b/writerperfect/source/common/WPFTEncodingDialog.cxx
new file mode 100644
index 000000000..fe812fc71
--- /dev/null
+++ b/writerperfect/source/common/WPFTEncodingDialog.cxx
@@ -0,0 +1,121 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <sal/config.h>
+
+#include <cstddef>
+#include <utility>
+
+#include <WPFTEncodingDialog.hxx>
+
+namespace writerperfect
+{
+namespace
+{
+std::pair<OUStringLiteral, OUStringLiteral> const s_encodings[]
+ = { { "MacArabic", "Arabic (Apple Macintosh)" },
+ { "CP864", "Arabic (DOS/OS2-864)" },
+ { "CP1006", "Arabic (IBM-1006)" },
+ { "CP1256", "Arabic (Windows-1256)" },
+ { "CP775", "Baltic (DOS/OS2-775)" },
+ { "CP1257", "Baltic (Windows-1257)" },
+ { "MacCeltic", "Celtic (Apple Macintosh)" },
+ { "MacCyrillic", "Cyrillic (Apple Macintosh)" },
+ { "CP855", "Cyrillic (DOS/OS2-855)" },
+ { "CP866", "Cyrillic (DOS/OS2-866/Russian)" },
+ { "CP1251", "Cyrillic (Windows-1251)" },
+ { "MacCEurope", "Eastern Europe (Apple Macintosh)" },
+ { "MacCroatian", "Eastern Europe (Apple Macintosh/Croatian)" },
+ { "MacRomanian", "Eastern Europe (Apple Macintosh/Romanian)" },
+ { "CP852", "Eastern Europe (DOS/OS2-852)" },
+ { "CP1250", "Eastern Europe (Windows-1250/WinLatin 2)" },
+ { "MacGreek", "Greek (Apple Macintosh)" },
+ { "CP737", "Greek (DOS/OS2-737)" },
+ { "CP869", "Greek (DOS/OS2-869/Greek-2)" },
+ { "CP875", "Greek (DOS/OS2-875)" },
+ { "CP1253", "Greek (Windows-1253)" },
+ { "MacHebrew", "Hebrew (Apple Macintosh)" },
+ { "CP424", "Hebrew (DOS/OS2-424)" },
+ { "CP856", "Hebrew (DOS/OS2-856)" },
+ { "CP862", "Hebrew (DOS/OS2-862)" },
+ { "CP1255", "Hebrew (Windows-1255)" },
+ { "CP500", "International (DOS/OS2-500)" },
+ { "CP932", "Japanese (Windows-932)" },
+ { "MacThai", "Thai (Apple Macintosh)" },
+ { "CP874", "Thai (DOS/OS2-874)" },
+ { "CP950", "Traditional Chinese (Windows-950)" },
+ { "MacTurkish", "Turkish (Apple Macintosh)" },
+ { "CP857", "Turkish (DOS/OS2-857)" },
+ { "CP1026", "Turkish (DOS/OS2-1026)" },
+ { "CP1254", "Turkish (Windows-1254)" },
+ { "CP1258", "Vietnamese (Windows-1258)" },
+ { "MacRoman", "Western Europe (Apple Macintosh)" },
+ { "MacIceland", "Western Europe (Apple Macintosh/Icelandic)" },
+ { "CP037", "Western Europe (DOS/OS2-037/US-Canada)" },
+ { "CP437", "Western Europe (DOS/OS2-437/US)" },
+ { "CP850", "Western Europe (DOS/OS2-850)" },
+ { "CP860", "Western Europe (DOS/OS2-860/Portuguese)" },
+ { "CP861", "Western Europe (DOS/OS2-861/Icelandic)" },
+ { "CP863", "Western Europe (DOS/OS2-863/French)" },
+ { "CP865", "Western Europe (DOS/OS2-865/Nordic)" },
+ { "CP1252", "Western Europe (Windows-1252/WinLatin 1)" } };
+
+std::size_t const numEncodings = SAL_N_ELEMENTS(s_encodings);
+
+void insertEncodings(weld::ComboBox& box)
+{
+ for (std::size_t i = 0; i < numEncodings; ++i)
+ box.append(s_encodings[i].first, s_encodings[i].second);
+}
+
+void selectEncoding(weld::ComboBox& box, const OUString& encoding) { box.set_active_id(encoding); }
+
+OUString getEncoding(const weld::ComboBox& box) { return box.get_active_id(); }
+}
+
+WPFTEncodingDialog::WPFTEncodingDialog(weld::Window* pParent, const OUString& title,
+ const OUString& encoding)
+ : GenericDialogController(pParent, "writerperfect/ui/wpftencodingdialog.ui",
+ "WPFTEncodingDialog")
+ , m_userHasCancelled(false)
+ , m_xLbCharset(m_xBuilder->weld_combo_box("comboboxtext"))
+ , m_xBtnOk(m_xBuilder->weld_button("ok"))
+ , m_xBtnCancel(m_xBuilder->weld_button("cancel"))
+{
+ m_xBtnCancel->connect_clicked(LINK(this, WPFTEncodingDialog, CancelHdl));
+
+ insertEncodings(*m_xLbCharset);
+ m_xLbCharset->make_sorted();
+ selectEncoding(*m_xLbCharset, encoding);
+
+ m_xDialog->set_title(title);
+}
+
+WPFTEncodingDialog::~WPFTEncodingDialog() {}
+
+OUString WPFTEncodingDialog::GetEncoding() const { return getEncoding(*m_xLbCharset); }
+
+IMPL_LINK_NOARG(WPFTEncodingDialog, CancelHdl, weld::Button&, void)
+{
+ m_userHasCancelled = true;
+ m_xDialog->response(RET_CANCEL);
+}
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/common/WPXSvInputStream.cxx b/writerperfect/source/common/WPXSvInputStream.cxx
new file mode 100644
index 000000000..8a6a52f17
--- /dev/null
+++ b/writerperfect/source/common/WPXSvInputStream.cxx
@@ -0,0 +1,969 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <WPXSvInputStream.hxx>
+
+#include <com/sun/star/packages/zip/XZipFileAccess2.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+#include <comphelper/processfactory.hxx>
+#include <comphelper/seekableinput.hxx>
+#include <o3tl/safeint.hxx>
+#include <rtl/string.hxx>
+#include <sal/log.hxx>
+
+#include <sot/storage.hxx>
+
+#include <tools/stream.hxx>
+#include <unotools/streamwrap.hxx>
+#include <unotools/ucbstreamhelper.hxx>
+
+#include <climits>
+#include <limits>
+#include <memory>
+#include <unordered_map>
+#include <vector>
+
+namespace writerperfect
+{
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::io;
+
+namespace container = com::sun::star::container;
+namespace packages = com::sun::star::packages;
+
+namespace
+{
+class PositionHolder
+{
+public:
+ explicit PositionHolder(const Reference<XSeekable>& rxSeekable);
+ ~PositionHolder();
+ PositionHolder(const PositionHolder&) = delete;
+ PositionHolder& operator=(const PositionHolder&) = delete;
+
+private:
+ const Reference<XSeekable> mxSeekable;
+ const sal_uInt64 mnPosition;
+};
+
+PositionHolder::PositionHolder(const Reference<XSeekable>& rxSeekable)
+ : mxSeekable(rxSeekable)
+ , mnPosition(rxSeekable->getPosition())
+{
+}
+
+PositionHolder::~PositionHolder()
+{
+ try
+ {
+ mxSeekable->seek(mnPosition);
+ }
+ catch (...)
+ {
+ }
+}
+
+} // anonymous namespace
+
+namespace
+{
+OUString lcl_normalizeSubStreamPath(const OUString& rPath)
+{
+ // accept paths which begin by '/'
+ // TODO: maybe this should do a full normalization
+ if (rPath.startsWith("/") && rPath.getLength() >= 2)
+ return rPath.copy(1);
+ return rPath;
+}
+}
+
+namespace
+{
+OUString concatPath(const OUString& lhs, const OUString& rhs)
+{
+ if (lhs.isEmpty())
+ return rhs;
+ return lhs + "/" + rhs;
+}
+
+struct OLEStreamData
+{
+ OLEStreamData(const OString& rName, const OString& rvngName);
+
+ tools::SvRef<SotStorageStream> stream;
+
+ /** Name of the stream.
+ *
+ * This is not @c OUString, because we need to be able to
+ * produce const char* from it.
+ */
+ OString name;
+ /** librevenge name of the stream.
+ *
+ * This is not @c OUString, because we need to be able to
+ * produce const char* from it.
+ */
+ OString RVNGname;
+};
+
+typedef std::unordered_map<OUString, std::size_t> NameMap_t;
+typedef std::unordered_map<OUString, tools::SvRef<SotStorage>> OLEStorageMap_t;
+
+/** Representation of an OLE2 storage.
+ *
+ * This class tries to bring a bit of sanity to use of SotStorage with
+ * respect to the needs of @c librevenge::RVNGInputStream API. It
+ * holds all nested storages for the whole lifetime (more precisely,
+ * since initialization, which is performed by calling @c
+ * initialize()), thus ensuring that no created stream is destroyed
+ * just because its parent storage went out of scope. It also holds a
+ * bidirectional map of stream names to their indexes (index of a
+ * stream is determined by deep-first traversal), which is also
+ * populated during initialization (member variables @c maStreams and
+ * @c maNameMap).
+ *
+ * Streams are created on demand (and saved, for the same reason as
+ * storages).
+ */
+struct OLEStorageImpl
+{
+ OLEStorageImpl();
+
+ void initialize(std::unique_ptr<SvStream> pStream);
+
+ tools::SvRef<SotStorageStream> getStream(const OUString& rPath);
+ tools::SvRef<SotStorageStream> const& getStream(std::size_t nId);
+
+private:
+ void traverse(const tools::SvRef<SotStorage>& rStorage, const OUString& rPath);
+
+ tools::SvRef<SotStorageStream> createStream(const OUString& rPath);
+
+public:
+ tools::SvRef<SotStorage> mxRootStorage; //< root storage of the OLE2
+ OLEStorageMap_t maStorageMap; //< map of all sub storages by name
+ ::std::vector<OLEStreamData> maStreams; //< list of streams and their names
+ NameMap_t maNameMap; //< map of stream names to indexes (into @c maStreams)
+ bool mbInitialized;
+};
+
+OLEStreamData::OLEStreamData(const OString& rName, const OString& rvngName)
+ : stream()
+ , name(rName)
+ , RVNGname(rvngName)
+{
+}
+
+OLEStorageImpl::OLEStorageImpl()
+ : mxRootStorage()
+ , maStorageMap()
+ , maStreams()
+ , maNameMap()
+ , mbInitialized(false)
+{
+}
+
+void OLEStorageImpl::initialize(std::unique_ptr<SvStream> pStream)
+{
+ if (!pStream)
+ return;
+
+ mxRootStorage = new SotStorage(pStream.release(), true);
+
+ traverse(mxRootStorage, "");
+
+ mbInitialized = true;
+}
+
+tools::SvRef<SotStorageStream> OLEStorageImpl::getStream(const OUString& rPath)
+{
+ const OUString aPath(lcl_normalizeSubStreamPath(rPath));
+ NameMap_t::iterator aIt = maNameMap.find(aPath);
+
+ // For the while don't return stream in this situation.
+ // Later, given how libcdr's zip stream implementation behaves,
+ // return the first stream in the storage if there is one.
+ if (maNameMap.end() == aIt)
+ return tools::SvRef<SotStorageStream>();
+
+ if (!maStreams[aIt->second].stream.is())
+ maStreams[aIt->second].stream
+ = createStream(OStringToOUString(maStreams[aIt->second].name, RTL_TEXTENCODING_UTF8));
+
+ return maStreams[aIt->second].stream;
+}
+
+tools::SvRef<SotStorageStream> const& OLEStorageImpl::getStream(const std::size_t nId)
+{
+ if (!maStreams[nId].stream.is())
+ maStreams[nId].stream
+ = createStream(OStringToOUString(maStreams[nId].name, RTL_TEXTENCODING_UTF8));
+
+ return maStreams[nId].stream;
+}
+
+void OLEStorageImpl::traverse(const tools::SvRef<SotStorage>& rStorage, const OUString& rPath)
+{
+ SvStorageInfoList infos;
+
+ rStorage->FillInfoList(&infos);
+
+ for (const auto& info : infos)
+ {
+ if (info.IsStream())
+ {
+ OUString baseName = info.GetName(), rvngName = baseName;
+ // librevenge::RVNGOLEStream ignores the first character when is a control code, so ...
+ if (!rvngName.isEmpty() && rvngName.toChar() < 32)
+ rvngName = rvngName.copy(1);
+ maStreams.emplace_back(
+ OUStringToOString(concatPath(rPath, baseName), RTL_TEXTENCODING_UTF8),
+ OUStringToOString(concatPath(rPath, rvngName), RTL_TEXTENCODING_UTF8));
+ maNameMap[concatPath(rPath, rvngName)] = maStreams.size() - 1;
+ }
+ else if (info.IsStorage())
+ {
+ const OUString aPath = concatPath(rPath, info.GetName());
+ tools::SvRef<SotStorage> aStorage
+ = rStorage->OpenSotStorage(info.GetName(), StreamMode::STD_READ);
+ maStorageMap[aPath] = aStorage;
+
+ // deep-first traversal
+ traverse(aStorage, aPath);
+ }
+ else
+ {
+ SAL_WARN("writerperfect",
+ "OLEStorageImpl::traverse: invalid storage entry, neither stream nor file");
+ }
+ }
+}
+
+tools::SvRef<SotStorageStream> OLEStorageImpl::createStream(const OUString& rPath)
+{
+ const sal_Int32 nDelim = rPath.lastIndexOf(u'/');
+
+ if (-1 == nDelim)
+ return mxRootStorage->OpenSotStream(rPath, StreamMode::STD_READ);
+
+ const OUString aDir = rPath.copy(0, nDelim);
+ const OUString aName = rPath.copy(nDelim + 1);
+
+ const OLEStorageMap_t::const_iterator aIt = maStorageMap.find(aDir);
+
+ if (maStorageMap.end() == aIt)
+ return nullptr;
+
+ return aIt->second->OpenSotStream(aName, StreamMode::STD_READ);
+}
+}
+
+namespace
+{
+struct ZipStreamData
+{
+ explicit ZipStreamData(const OString& rName);
+
+ Reference<XInputStream> xStream;
+
+ /** Name of the stream.
+ *
+ * This is not @c OUString, because we need to be able to
+ * produce const char* from it.
+ */
+ OString aName;
+};
+
+/** Representation of a Zip storage.
+ *
+ * This is quite similar to OLEStorageImpl, except that we do not need
+ * to keep all storages (folders) open.
+ */
+struct ZipStorageImpl
+{
+ explicit ZipStorageImpl(const Reference<container::XNameAccess>& rxContainer);
+
+ /** Initialize for access.
+ *
+ * This creates a bidirectional map of stream names to their
+ * indexes (index of a stream is determined by deep-first
+ * traversal).
+ */
+ void initialize();
+
+ Reference<XInputStream> getStream(const OUString& rPath);
+ Reference<XInputStream> const& getStream(std::size_t nId);
+
+private:
+ void traverse(const Reference<container::XNameAccess>& rxEnum);
+
+ Reference<XInputStream> createStream(const OUString& rPath);
+
+public:
+ Reference<container::XNameAccess> mxContainer; //< root of the Zip
+ ::std::vector<ZipStreamData> maStreams; //< list of streams and their names
+ NameMap_t maNameMap; //< map of stream names to indexes (into @c maStreams)
+ bool mbInitialized;
+};
+
+ZipStreamData::ZipStreamData(const OString& rName)
+ : xStream()
+ , aName(rName)
+{
+}
+
+ZipStorageImpl::ZipStorageImpl(const Reference<container::XNameAccess>& rxContainer)
+ : mxContainer(rxContainer)
+ , maStreams()
+ , maNameMap()
+ , mbInitialized(false)
+{
+ assert(mxContainer.is());
+}
+
+void ZipStorageImpl::initialize()
+{
+ traverse(mxContainer);
+
+ mbInitialized = true;
+}
+
+Reference<XInputStream> ZipStorageImpl::getStream(const OUString& rPath)
+{
+ const OUString aPath(lcl_normalizeSubStreamPath(rPath));
+ NameMap_t::iterator aIt = maNameMap.find(aPath);
+
+ // For the while don't return stream in this situation.
+ // Later, given how libcdr's zip stream implementation behaves,
+ // return the first stream in the storage if there is one.
+ if (maNameMap.end() == aIt)
+ return Reference<XInputStream>();
+
+ if (!maStreams[aIt->second].xStream.is())
+ maStreams[aIt->second].xStream = createStream(aPath);
+
+ return maStreams[aIt->second].xStream;
+}
+
+Reference<XInputStream> const& ZipStorageImpl::getStream(const std::size_t nId)
+{
+ if (!maStreams[nId].xStream.is())
+ maStreams[nId].xStream
+ = createStream(OStringToOUString(maStreams[nId].aName, RTL_TEXTENCODING_UTF8));
+
+ return maStreams[nId].xStream;
+}
+
+void ZipStorageImpl::traverse(const Reference<container::XNameAccess>& rxContainer)
+{
+ const Sequence<OUString> lNames = rxContainer->getElementNames();
+
+ maStreams.reserve(lNames.getLength());
+
+ for (const auto& rName : lNames)
+ {
+ if (!rName.endsWith("/")) // skip dirs
+ {
+ maStreams.emplace_back(OUStringToOString(rName, RTL_TEXTENCODING_UTF8));
+ maNameMap[rName] = maStreams.size() - 1;
+ }
+ }
+}
+
+Reference<XInputStream> ZipStorageImpl::createStream(const OUString& rPath)
+{
+ Reference<XInputStream> xStream;
+
+ try
+ {
+ const Reference<XInputStream> xInputStream(mxContainer->getByName(rPath), UNO_QUERY_THROW);
+ const Reference<XSeekable> xSeekable(xInputStream, UNO_QUERY);
+
+ if (xSeekable.is())
+ xStream = xInputStream;
+ else
+ xStream.set(new comphelper::OSeekableInputWrapper(
+ xInputStream, comphelper::getProcessComponentContext()));
+ }
+ catch (const Exception&)
+ {
+ // nothing needed
+ }
+
+ return xStream;
+}
+}
+
+class WPXSvInputStreamImpl
+{
+public:
+ explicit WPXSvInputStreamImpl(css::uno::Reference<css::io::XInputStream> const& xStream);
+
+ bool isStructured();
+ unsigned subStreamCount();
+ const char* subStreamName(unsigned id);
+ bool existsSubStream(const char* name);
+ librevenge::RVNGInputStream* getSubStreamByName(const char* name);
+ librevenge::RVNGInputStream* getSubStreamById(unsigned id);
+
+ const unsigned char* read(unsigned long numBytes, unsigned long& numBytesRead);
+ int seek(long offset);
+ long tell();
+ bool isEnd();
+
+ void invalidateReadBuffer();
+
+private:
+ bool isOLE();
+ void ensureOLEIsInitialized();
+
+ bool isZip();
+ void ensureZipIsInitialized();
+
+ static librevenge::RVNGInputStream*
+ createWPXStream(const tools::SvRef<SotStorageStream>& rxStorage);
+ static librevenge::RVNGInputStream* createWPXStream(const Reference<XInputStream>& rxStream);
+
+private:
+ css::uno::Reference<css::io::XInputStream> mxStream;
+ css::uno::Reference<css::io::XSeekable> mxSeekable;
+ css::uno::Sequence<sal_Int8> maData;
+ std::unique_ptr<OLEStorageImpl> mpOLEStorage;
+ std::unique_ptr<ZipStorageImpl> mpZipStorage;
+ bool mbCheckedOLE;
+ bool mbCheckedZip;
+
+public:
+ sal_Int64 mnLength;
+ const unsigned char* mpReadBuffer;
+ unsigned long mnReadBufferLength;
+ unsigned long mnReadBufferPos;
+};
+
+WPXSvInputStreamImpl::WPXSvInputStreamImpl(Reference<XInputStream> const& xStream)
+ : mxStream(xStream)
+ , mxSeekable(xStream, UNO_QUERY)
+ , maData(0)
+ , mbCheckedOLE(false)
+ , mbCheckedZip(false)
+ , mnLength(0)
+ , mpReadBuffer(nullptr)
+ , mnReadBufferLength(0)
+ , mnReadBufferPos(0)
+{
+ if (!xStream.is() || !mxStream.is())
+ mnLength = 0;
+ else
+ {
+ if (!mxSeekable.is())
+ mnLength = 0;
+ else
+ {
+ try
+ {
+ mnLength = mxSeekable->getLength();
+ if (0 < mxSeekable->getPosition())
+ mxSeekable->seek(0);
+ }
+ catch (...)
+ {
+ SAL_WARN("writerperfect", "mnLength = mxSeekable->getLength() threw exception");
+ mnLength = 0;
+ }
+ }
+ }
+}
+
+const unsigned char* WPXSvInputStreamImpl::read(unsigned long numBytes, unsigned long& numBytesRead)
+{
+ numBytesRead = 0;
+
+ if (numBytes == 0 || isEnd())
+ return nullptr;
+
+ numBytesRead = mxStream->readSomeBytes(maData, numBytes);
+ if (numBytesRead == 0)
+ return nullptr;
+
+ return reinterpret_cast<const unsigned char*>(maData.getConstArray());
+}
+
+long WPXSvInputStreamImpl::tell()
+{
+ if ((mnLength == 0) || !mxStream.is() || !mxSeekable.is())
+ return -1;
+ else
+ {
+ const sal_Int64 tmpPosition = mxSeekable->getPosition();
+ if ((tmpPosition < 0) || (tmpPosition > LONG_MAX))
+ return -1;
+ return static_cast<long>(tmpPosition);
+ }
+}
+
+int WPXSvInputStreamImpl::seek(long offset)
+{
+ if ((mnLength == 0) || !mxStream.is() || !mxSeekable.is())
+ return -1;
+
+ const sal_Int64 tmpPosition = mxSeekable->getPosition();
+ if ((tmpPosition < 0) || (tmpPosition > LONG_MAX))
+ return -1;
+
+ try
+ {
+ mxSeekable->seek(offset);
+ return 0;
+ }
+ catch (...)
+ {
+ SAL_WARN("writerperfect", "mxSeekable->seek(offset) threw exception");
+ return -1;
+ }
+}
+
+bool WPXSvInputStreamImpl::isEnd()
+{
+ if ((mnLength == 0) || !mxStream.is() || !mxSeekable.is())
+ return true;
+ return (mxSeekable->getPosition() >= mnLength);
+}
+
+bool WPXSvInputStreamImpl::isStructured()
+{
+ if ((mnLength == 0) || !mxStream.is() || !mxSeekable.is())
+ return false;
+
+ PositionHolder pos(mxSeekable);
+ mxSeekable->seek(0);
+
+ if (isOLE())
+ return true;
+
+ mxSeekable->seek(0);
+
+ return isZip();
+}
+
+unsigned WPXSvInputStreamImpl::subStreamCount()
+{
+ if ((mnLength == 0) || !mxStream.is() || !mxSeekable.is())
+ return 0;
+
+ PositionHolder pos(mxSeekable);
+ mxSeekable->seek(0);
+
+ if (isOLE())
+ {
+ ensureOLEIsInitialized();
+
+ return mpOLEStorage->maStreams.size();
+ }
+
+ mxSeekable->seek(0);
+
+ if (isZip())
+ {
+ ensureZipIsInitialized();
+
+ return mpZipStorage->maStreams.size();
+ }
+
+ return 0;
+}
+
+const char* WPXSvInputStreamImpl::subStreamName(const unsigned id)
+{
+ if ((mnLength == 0) || !mxStream.is() || !mxSeekable.is())
+ return nullptr;
+
+ PositionHolder pos(mxSeekable);
+ mxSeekable->seek(0);
+
+ if (isOLE())
+ {
+ ensureOLEIsInitialized();
+
+ if (mpOLEStorage->maStreams.size() <= id)
+ return nullptr;
+
+ return mpOLEStorage->maStreams[id].RVNGname.getStr();
+ }
+
+ mxSeekable->seek(0);
+
+ if (isZip())
+ {
+ ensureZipIsInitialized();
+
+ if (mpZipStorage->maStreams.size() <= id)
+ return nullptr;
+
+ return mpZipStorage->maStreams[id].aName.getStr();
+ }
+
+ return nullptr;
+}
+
+bool WPXSvInputStreamImpl::existsSubStream(const char* const name)
+{
+ if (!name)
+ return false;
+
+ if ((mnLength == 0) || !mxStream.is() || !mxSeekable.is())
+ return false;
+
+ PositionHolder pos(mxSeekable);
+ mxSeekable->seek(0);
+
+ const OUString aName(OStringToOUString(OString(name), RTL_TEXTENCODING_UTF8));
+
+ if (isOLE())
+ {
+ ensureOLEIsInitialized();
+ return mpOLEStorage->maNameMap.end() != mpOLEStorage->maNameMap.find(aName);
+ }
+
+ mxSeekable->seek(0);
+
+ if (isZip())
+ {
+ ensureZipIsInitialized();
+ return mpZipStorage->maNameMap.end() != mpZipStorage->maNameMap.find(aName);
+ }
+
+ return false;
+}
+
+librevenge::RVNGInputStream* WPXSvInputStreamImpl::getSubStreamByName(const char* const name)
+{
+ if (!name)
+ return nullptr;
+
+ if ((mnLength == 0) || !mxStream.is() || !mxSeekable.is())
+ return nullptr;
+
+ PositionHolder pos(mxSeekable);
+ mxSeekable->seek(0);
+
+ const OUString aName(OStringToOUString(OString(name), RTL_TEXTENCODING_UTF8));
+
+ if (isOLE())
+ {
+ ensureOLEIsInitialized();
+ return createWPXStream(mpOLEStorage->getStream(aName));
+ }
+
+ mxSeekable->seek(0);
+
+ if (isZip())
+ {
+ ensureZipIsInitialized();
+
+ try
+ {
+ return createWPXStream(mpZipStorage->getStream(aName));
+ }
+ catch (const Exception&)
+ {
+ // nothing needed
+ }
+ }
+
+ return nullptr;
+}
+
+librevenge::RVNGInputStream* WPXSvInputStreamImpl::getSubStreamById(const unsigned id)
+{
+ if ((mnLength == 0) || !mxStream.is() || !mxSeekable.is())
+ return nullptr;
+
+ PositionHolder pos(mxSeekable);
+ mxSeekable->seek(0);
+
+ if (isOLE())
+ {
+ ensureOLEIsInitialized();
+
+ if (mpOLEStorage->maStreams.size() <= id)
+ return nullptr;
+
+ return createWPXStream(mpOLEStorage->getStream(id));
+ }
+
+ mxSeekable->seek(0);
+
+ if (isZip())
+ {
+ ensureZipIsInitialized();
+
+ if (mpZipStorage->maStreams.size() <= id)
+ return nullptr;
+
+ try
+ {
+ return createWPXStream(mpZipStorage->getStream(id));
+ }
+ catch (const Exception&)
+ {
+ // nothing needed
+ }
+ }
+ return nullptr;
+}
+
+void WPXSvInputStreamImpl::invalidateReadBuffer()
+{
+ if (mpReadBuffer)
+ {
+ seek(tell() + static_cast<long>(mnReadBufferPos) - static_cast<long>(mnReadBufferLength));
+ mpReadBuffer = nullptr;
+ mnReadBufferPos = 0;
+ mnReadBufferLength = 0;
+ }
+}
+
+librevenge::RVNGInputStream*
+WPXSvInputStreamImpl::createWPXStream(const tools::SvRef<SotStorageStream>& rxStorage)
+{
+ if (rxStorage.is())
+ {
+ Reference<XInputStream> xContents(new utl::OSeekableInputStreamWrapper(rxStorage.get()));
+ return new WPXSvInputStream(xContents);
+ }
+ return nullptr;
+}
+
+librevenge::RVNGInputStream*
+WPXSvInputStreamImpl::createWPXStream(const Reference<XInputStream>& rxStream)
+{
+ if (rxStream.is())
+ return new WPXSvInputStream(rxStream);
+ else
+ return nullptr;
+}
+
+bool WPXSvInputStreamImpl::isOLE()
+{
+ if (!mbCheckedOLE)
+ {
+ assert(0 == mxSeekable->getPosition());
+
+ std::unique_ptr<SvStream> pStream(utl::UcbStreamHelper::CreateStream(mxStream));
+ if (pStream && SotStorage::IsOLEStorage(pStream.get()))
+ mpOLEStorage.reset(new OLEStorageImpl());
+
+ mbCheckedOLE = true;
+ }
+
+ return bool(mpOLEStorage);
+}
+
+bool WPXSvInputStreamImpl::isZip()
+{
+ if (!mbCheckedZip)
+ {
+ assert(0 == mxSeekable->getPosition());
+
+ try
+ {
+ Sequence<Any> aArgs(1);
+ aArgs[0] <<= mxStream;
+
+ const Reference<XComponentContext> xContext(comphelper::getProcessComponentContext(),
+ UNO_SET_THROW);
+ const Reference<packages::zip::XZipFileAccess2> xZip(
+ xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
+ "com.sun.star.packages.zip.ZipFileAccess", aArgs, xContext),
+ UNO_QUERY_THROW);
+ mpZipStorage.reset(new ZipStorageImpl(xZip));
+ }
+ catch (const Exception&)
+ {
+ // ignore
+ }
+
+ mbCheckedZip = true;
+ }
+
+ return bool(mpZipStorage);
+}
+
+void WPXSvInputStreamImpl::ensureOLEIsInitialized()
+{
+ assert(mpOLEStorage);
+
+ if (!mpOLEStorage->mbInitialized)
+ mpOLEStorage->initialize(utl::UcbStreamHelper::CreateStream(mxStream));
+}
+
+void WPXSvInputStreamImpl::ensureZipIsInitialized()
+{
+ assert(mpZipStorage);
+
+ if (!mpZipStorage->mbInitialized)
+ mpZipStorage->initialize();
+}
+
+WPXSvInputStream::WPXSvInputStream(Reference<XInputStream> const& xStream)
+ : mpImpl(new WPXSvInputStreamImpl(xStream))
+{
+}
+
+WPXSvInputStream::~WPXSvInputStream() {}
+
+#define BUFFER_MAX 65536
+
+const unsigned char* WPXSvInputStream::read(unsigned long numBytes, unsigned long& numBytesRead)
+{
+ numBytesRead = 0;
+
+ if (numBytes == 0 || numBytes > std::numeric_limits<unsigned long>::max() / 2)
+ return nullptr;
+
+ if (mpImpl->mpReadBuffer)
+ {
+ if ((mpImpl->mnReadBufferPos + numBytes > mpImpl->mnReadBufferPos)
+ && (mpImpl->mnReadBufferPos + numBytes <= mpImpl->mnReadBufferLength))
+ {
+ const unsigned char* pTmp = mpImpl->mpReadBuffer + mpImpl->mnReadBufferPos;
+ mpImpl->mnReadBufferPos += numBytes;
+ numBytesRead = numBytes;
+ return pTmp;
+ }
+
+ mpImpl->invalidateReadBuffer();
+ }
+
+ unsigned long curpos = static_cast<unsigned long>(mpImpl->tell());
+ if (curpos == static_cast<unsigned long>(-1)) // returned ERROR
+ return nullptr;
+
+ if ((curpos + numBytes < curpos) /*overflow*/
+ || (curpos + numBytes
+ >= o3tl::make_unsigned(mpImpl->mnLength))) /*reading more than available*/
+ {
+ numBytes = mpImpl->mnLength - curpos;
+ }
+
+ if (numBytes < BUFFER_MAX)
+ {
+ if (BUFFER_MAX < mpImpl->mnLength - curpos)
+ mpImpl->mnReadBufferLength = BUFFER_MAX;
+ else /* BUFFER_MAX >= mpImpl->mnLength - curpos */
+ mpImpl->mnReadBufferLength = mpImpl->mnLength - curpos;
+ }
+ else
+ mpImpl->mnReadBufferLength = numBytes;
+
+ unsigned long tmpNumBytes(0);
+ mpImpl->mpReadBuffer = mpImpl->read(mpImpl->mnReadBufferLength, tmpNumBytes);
+ if (tmpNumBytes != mpImpl->mnReadBufferLength)
+ mpImpl->mnReadBufferLength = tmpNumBytes;
+
+ mpImpl->mnReadBufferPos = 0;
+ if (!mpImpl->mnReadBufferLength)
+ return nullptr;
+
+ if (numBytes <= mpImpl->mnReadBufferLength)
+ numBytesRead = numBytes;
+ else
+ numBytesRead = mpImpl->mnReadBufferLength;
+
+ mpImpl->mnReadBufferPos += numBytesRead;
+ return mpImpl->mpReadBuffer;
+}
+
+long WPXSvInputStream::tell()
+{
+ long retVal = mpImpl->tell();
+ return retVal - static_cast<long>(mpImpl->mnReadBufferLength)
+ + static_cast<long>(mpImpl->mnReadBufferPos);
+}
+
+int WPXSvInputStream::seek(long offset, librevenge::RVNG_SEEK_TYPE seekType)
+{
+ sal_Int64 tmpOffset = offset;
+ if (seekType == librevenge::RVNG_SEEK_CUR)
+ tmpOffset += tell();
+ if (seekType == librevenge::RVNG_SEEK_END)
+ tmpOffset += mpImpl->mnLength;
+
+ int retVal = 0;
+ if (tmpOffset < 0)
+ {
+ tmpOffset = 0;
+ retVal = -1;
+ }
+ if (tmpOffset > mpImpl->mnLength)
+ {
+ tmpOffset = mpImpl->mnLength;
+ retVal = -1;
+ }
+
+ if (tmpOffset < mpImpl->tell()
+ && o3tl::make_unsigned(tmpOffset)
+ >= static_cast<unsigned long>(mpImpl->tell()) - mpImpl->mnReadBufferLength)
+ {
+ mpImpl->mnReadBufferPos = static_cast<unsigned long>(
+ tmpOffset + static_cast<long>(mpImpl->mnReadBufferLength) - mpImpl->tell());
+ return retVal;
+ }
+
+ mpImpl->invalidateReadBuffer();
+
+ if (mpImpl->seek(tmpOffset))
+ return -1;
+ return retVal;
+}
+
+bool WPXSvInputStream::isEnd()
+{
+ return mpImpl->isEnd() && mpImpl->mnReadBufferPos == mpImpl->mnReadBufferLength;
+}
+
+bool WPXSvInputStream::isStructured()
+{
+ mpImpl->invalidateReadBuffer();
+ return mpImpl->isStructured();
+}
+
+unsigned WPXSvInputStream::subStreamCount()
+{
+ mpImpl->invalidateReadBuffer();
+ return mpImpl->subStreamCount();
+}
+
+const char* WPXSvInputStream::subStreamName(const unsigned id)
+{
+ mpImpl->invalidateReadBuffer();
+ return mpImpl->subStreamName(id);
+}
+
+bool WPXSvInputStream::existsSubStream(const char* const name)
+{
+ mpImpl->invalidateReadBuffer();
+ return mpImpl->existsSubStream(name);
+}
+
+librevenge::RVNGInputStream* WPXSvInputStream::getSubStreamByName(const char* name)
+{
+ mpImpl->invalidateReadBuffer();
+ return mpImpl->getSubStreamByName(name);
+}
+
+librevenge::RVNGInputStream* WPXSvInputStream::getSubStreamById(const unsigned id)
+{
+ mpImpl->invalidateReadBuffer();
+ return mpImpl->getSubStreamById(id);
+}
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/draw/CDRImportFilter.cxx b/writerperfect/source/draw/CDRImportFilter.cxx
new file mode 100644
index 000000000..34b490326
--- /dev/null
+++ b/writerperfect/source/draw/CDRImportFilter.cxx
@@ -0,0 +1,60 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* CDRImportFilter: Sets up the filter, and calls OdgExporter
+ * to do the actual filtering
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+/* "This product is not manufactured, approved, or supported by
+ * Corel Corporation or Corel Corporation Limited."
+ */
+
+#include <cppuhelper/supportsservice.hxx>
+
+#include <libcdr/libcdr.h>
+
+#include "CDRImportFilter.hxx"
+
+bool CDRImportFilter::doImportDocument(weld::Window*, librevenge::RVNGInputStream& rInput,
+ OdgGenerator& rGenerator, utl::MediaDescriptor&)
+{
+ return libcdr::CDRDocument::parse(&rInput, &rGenerator);
+}
+
+bool CDRImportFilter::doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName)
+{
+ if (libcdr::CDRDocument::isSupported(&rInput))
+ {
+ rTypeName = "draw_CorelDraw_Document";
+ return true;
+ }
+
+ return false;
+}
+
+// XServiceInfo
+OUString SAL_CALL CDRImportFilter::getImplementationName()
+{
+ return "com.sun.star.comp.Draw.CDRImportFilter";
+}
+
+sal_Bool SAL_CALL CDRImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+css::uno::Sequence<OUString> SAL_CALL CDRImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Draw_CDRImportFilter_get_implementation(
+ css::uno::XComponentContext* const context, const css::uno::Sequence<css::uno::Any>&)
+{
+ return cppu::acquire(new CDRImportFilter(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/draw/CDRImportFilter.hxx b/writerperfect/source/draw/CDRImportFilter.hxx
new file mode 100644
index 000000000..5d7c5334b
--- /dev/null
+++ b/writerperfect/source/draw/CDRImportFilter.hxx
@@ -0,0 +1,42 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+/* "This product is not manufactured, approved, or supported by
+ * Corel Corporation or Corel Corporation Limited."
+ */
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_DRAW_CDRIMPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_DRAW_CDRIMPORTFILTER_HXX
+
+#include <ImportFilter.hxx>
+
+#include <DocumentHandlerForOdg.hxx>
+
+/* This component will be instantiated for both import or export. Whether it calls
+ * setSourceDocument or setTargetDocument determines which Impl function the filter
+ * member calls */
+class CDRImportFilter : public writerperfect::ImportFilter<OdgGenerator>
+{
+public:
+ explicit CDRImportFilter(const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdgGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
+ OdgGenerator& rGenerator, utl::MediaDescriptor&) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/draw/CMXImportFilter.cxx b/writerperfect/source/draw/CMXImportFilter.cxx
new file mode 100644
index 000000000..23aab816a
--- /dev/null
+++ b/writerperfect/source/draw/CMXImportFilter.cxx
@@ -0,0 +1,60 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* CMXImportFilter: Sets up the filter, and calls OdgExporter
+ * to do the actual filtering
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+/* "This product is not manufactured, approved, or supported by
+ * Corel Corporation or Corel Corporation Limited."
+ */
+
+#include <cppuhelper/supportsservice.hxx>
+
+#include <libcdr/libcdr.h>
+
+#include "CMXImportFilter.hxx"
+
+bool CMXImportFilter::doImportDocument(weld::Window*, librevenge::RVNGInputStream& rInput,
+ OdgGenerator& rGenerator, utl::MediaDescriptor&)
+{
+ return libcdr::CMXDocument::parse(&rInput, &rGenerator);
+}
+
+bool CMXImportFilter::doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName)
+{
+ if (libcdr::CMXDocument::isSupported(&rInput))
+ {
+ rTypeName = "draw_Corel_Presentation_Exchange";
+ return true;
+ }
+
+ return false;
+}
+
+// XServiceInfo
+OUString SAL_CALL CMXImportFilter::getImplementationName()
+{
+ return "com.sun.star.comp.Draw.CMXImportFilter";
+}
+
+sal_Bool SAL_CALL CMXImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+css::uno::Sequence<OUString> SAL_CALL CMXImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Draw_CMXImportFilter_get_implementation(
+ css::uno::XComponentContext* const context, const css::uno::Sequence<css::uno::Any>&)
+{
+ return cppu::acquire(new CMXImportFilter(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/draw/CMXImportFilter.hxx b/writerperfect/source/draw/CMXImportFilter.hxx
new file mode 100644
index 000000000..0e6d9b46d
--- /dev/null
+++ b/writerperfect/source/draw/CMXImportFilter.hxx
@@ -0,0 +1,42 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+/* "This product is not manufactured, approved, or supported by
+ * Corel Corporation or Corel Corporation Limited."
+ */
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_DRAW_CMXIMPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_DRAW_CMXIMPORTFILTER_HXX
+
+#include <ImportFilter.hxx>
+
+#include <DocumentHandlerForOdg.hxx>
+
+/* This component will be instantiated for both import or export. Whether it calls
+ * setSourceDocument or setTargetDocument determines which Impl function the filter
+ * member calls */
+class CMXImportFilter : public writerperfect::ImportFilter<OdgGenerator>
+{
+public:
+ explicit CMXImportFilter(const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdgGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
+ OdgGenerator& rGenerator, utl::MediaDescriptor&) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/draw/FreehandImportFilter.cxx b/writerperfect/source/draw/FreehandImportFilter.cxx
new file mode 100644
index 000000000..68dd7b56b
--- /dev/null
+++ b/writerperfect/source/draw/FreehandImportFilter.cxx
@@ -0,0 +1,56 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* FreehandImportFilter: Sets up the filter, and calls OdgExporter
+ * to do the actual filtering
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <cppuhelper/supportsservice.hxx>
+
+#include <libfreehand/libfreehand.h>
+
+#include "FreehandImportFilter.hxx"
+
+bool FreehandImportFilter::doImportDocument(weld::Window*, librevenge::RVNGInputStream& rInput,
+ OdgGenerator& rGenerator, utl::MediaDescriptor&)
+{
+ return libfreehand::FreeHandDocument::parse(&rInput, &rGenerator);
+}
+
+bool FreehandImportFilter::doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName)
+{
+ if (libfreehand::FreeHandDocument::isSupported(&rInput))
+ {
+ rTypeName = "draw_Freehand_Document";
+ return true;
+ }
+
+ return false;
+}
+
+// XServiceInfo
+OUString SAL_CALL FreehandImportFilter::getImplementationName()
+{
+ return "com.sun.star.comp.Draw.FreehandImportFilter";
+}
+
+sal_Bool SAL_CALL FreehandImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+css::uno::Sequence<OUString> SAL_CALL FreehandImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Draw_FreehandImportFilter_get_implementation(
+ css::uno::XComponentContext* const context, const css::uno::Sequence<css::uno::Any>&)
+{
+ return cppu::acquire(new FreehandImportFilter(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/draw/FreehandImportFilter.hxx b/writerperfect/source/draw/FreehandImportFilter.hxx
new file mode 100644
index 000000000..99921bdf6
--- /dev/null
+++ b/writerperfect/source/draw/FreehandImportFilter.hxx
@@ -0,0 +1,39 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_DRAW_FREEHANDIMPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_DRAW_FREEHANDIMPORTFILTER_HXX
+
+#include <ImportFilter.hxx>
+
+#include <DocumentHandlerForOdg.hxx>
+
+/* This component will be instantiated for both import or export. Whether it calls
+ * setSourceDocument or setTargetDocument determines which Impl function the filter
+ * member calls */
+class FreehandImportFilter : public writerperfect::ImportFilter<OdgGenerator>
+{
+public:
+ explicit FreehandImportFilter(const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdgGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
+ OdgGenerator& rGenerator, utl::MediaDescriptor&) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/draw/MSPUBImportFilter.cxx b/writerperfect/source/draw/MSPUBImportFilter.cxx
new file mode 100644
index 000000000..ba34cd2f1
--- /dev/null
+++ b/writerperfect/source/draw/MSPUBImportFilter.cxx
@@ -0,0 +1,56 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* MSPUBImportFilter: Sets up the filter, and calls OdgExporter
+ * to do the actual filtering
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <cppuhelper/supportsservice.hxx>
+
+#include <libmspub/libmspub.h>
+
+#include "MSPUBImportFilter.hxx"
+
+bool MSPUBImportFilter::doImportDocument(weld::Window*, librevenge::RVNGInputStream& rInput,
+ OdgGenerator& rGenerator, utl::MediaDescriptor&)
+{
+ return libmspub::MSPUBDocument::parse(&rInput, &rGenerator);
+}
+
+bool MSPUBImportFilter::doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName)
+{
+ if (libmspub::MSPUBDocument::isSupported(&rInput))
+ {
+ rTypeName = "draw_Publisher_Document";
+ return true;
+ }
+
+ return false;
+}
+
+// XServiceInfo
+OUString SAL_CALL MSPUBImportFilter::getImplementationName()
+{
+ return "com.sun.star.comp.Draw.MSPUBImportFilter";
+}
+
+sal_Bool SAL_CALL MSPUBImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+css::uno::Sequence<OUString> SAL_CALL MSPUBImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Draw_MSPUBImportFilter_get_implementation(
+ css::uno::XComponentContext* const context, const css::uno::Sequence<css::uno::Any>&)
+{
+ return cppu::acquire(new MSPUBImportFilter(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/draw/MSPUBImportFilter.hxx b/writerperfect/source/draw/MSPUBImportFilter.hxx
new file mode 100644
index 000000000..3e2125198
--- /dev/null
+++ b/writerperfect/source/draw/MSPUBImportFilter.hxx
@@ -0,0 +1,39 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_DRAW_MSPUBIMPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_DRAW_MSPUBIMPORTFILTER_HXX
+
+#include <ImportFilter.hxx>
+
+#include <DocumentHandlerForOdg.hxx>
+
+/* This component will be instantiated for both import or export. Whether it calls
+ * setSourceDocument or setTargetDocument determines which Impl function the filter
+ * member calls */
+class MSPUBImportFilter : public writerperfect::ImportFilter<OdgGenerator>
+{
+public:
+ explicit MSPUBImportFilter(const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdgGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
+ OdgGenerator& rGenerator, utl::MediaDescriptor&) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/draw/MWAWDrawImportFilter.cxx b/writerperfect/source/draw/MWAWDrawImportFilter.cxx
new file mode 100644
index 000000000..000debdcb
--- /dev/null
+++ b/writerperfect/source/draw/MWAWDrawImportFilter.cxx
@@ -0,0 +1,116 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* MWAWDrawImportFilter: Sets up the filter, and calls DocumentCollector
+ * to do the actual filtering
+ *
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <cppuhelper/supportsservice.hxx>
+
+#include <libmwaw/libmwaw.hxx>
+
+#include "MWAWDrawImportFilter.hxx"
+
+static bool handleEmbeddedMWAWGraphicObject(const librevenge::RVNGBinaryData& data,
+ OdfDocumentHandler* pHandler,
+ const OdfStreamType streamType)
+{
+ OdgGenerator exporter;
+ exporter.addDocumentHandler(pHandler, streamType);
+ return MWAWDocument::decodeGraphic(data, &exporter);
+}
+
+static bool handleEmbeddedMWAWSpreadsheetObject(const librevenge::RVNGBinaryData& data,
+ OdfDocumentHandler* pHandler,
+ const OdfStreamType streamType)
+{
+ OdsGenerator exporter;
+ exporter.registerEmbeddedObjectHandler("image/mwaw-odg", &handleEmbeddedMWAWGraphicObject);
+ exporter.addDocumentHandler(pHandler, streamType);
+ return MWAWDocument::decodeSpreadsheet(data, &exporter);
+}
+
+bool MWAWDrawImportFilter::doImportDocument(weld::Window*, librevenge::RVNGInputStream& rInput,
+ OdgGenerator& rGenerator, utl::MediaDescriptor&)
+{
+ return MWAWDocument::MWAW_R_OK == MWAWDocument::parse(&rInput, &rGenerator);
+}
+
+bool MWAWDrawImportFilter::doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName)
+{
+ rTypeName.clear();
+
+ MWAWDocument::Type docType = MWAWDocument::MWAW_T_UNKNOWN;
+ MWAWDocument::Kind docKind = MWAWDocument::MWAW_K_UNKNOWN;
+ const MWAWDocument::Confidence confidence
+ = MWAWDocument::isFileFormatSupported(&rInput, docType, docKind);
+
+ if (confidence == MWAWDocument::MWAW_C_EXCELLENT)
+ {
+ switch (docKind)
+ {
+ case MWAWDocument::MWAW_K_DRAW:
+ switch (docType)
+ {
+ case MWAWDocument::MWAW_T_CLARISWORKS:
+ rTypeName = "draw_ClarisWorks";
+ break;
+ default:
+ rTypeName = "MWAW_Drawing";
+ break;
+ }
+ break;
+ case MWAWDocument::MWAW_K_PAINT:
+ switch (docType)
+ {
+ case MWAWDocument::MWAW_T_CLARISWORKS:
+ rTypeName = "draw_ClarisWorks";
+ break;
+ default:
+ rTypeName = "MWAW_Bitmap";
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ return !rTypeName.isEmpty();
+}
+
+void MWAWDrawImportFilter::doRegisterHandlers(OdgGenerator& rGenerator)
+{
+ rGenerator.registerEmbeddedObjectHandler("image/mwaw-odg", &handleEmbeddedMWAWGraphicObject);
+ rGenerator.registerEmbeddedObjectHandler("image/mwaw-ods",
+ &handleEmbeddedMWAWSpreadsheetObject);
+}
+
+// XServiceInfo
+OUString SAL_CALL MWAWDrawImportFilter::getImplementationName()
+{
+ return "com.sun.star.comp.Draw.MWAWDrawImportFilter";
+}
+
+sal_Bool SAL_CALL MWAWDrawImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+css::uno::Sequence<OUString> SAL_CALL MWAWDrawImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Draw_MWAWDrawImportFilter_get_implementation(
+ css::uno::XComponentContext* const context, const css::uno::Sequence<css::uno::Any>&)
+{
+ return cppu::acquire(new MWAWDrawImportFilter(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/draw/MWAWDrawImportFilter.hxx b/writerperfect/source/draw/MWAWDrawImportFilter.hxx
new file mode 100644
index 000000000..ddc305830
--- /dev/null
+++ b/writerperfect/source/draw/MWAWDrawImportFilter.hxx
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_DRAW_MWAWDRAWIMPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_DRAW_MWAWDRAWIMPORTFILTER_HXX
+
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+#include <ImportFilter.hxx>
+
+#include <DocumentHandlerForOdg.hxx>
+
+/* This component will be instantiated for both import or export. Whether it calls
+ * setSourceDocument or setTargetDocument determines which Impl function the filter
+ * member calls */
+class MWAWDrawImportFilter : public writerperfect::ImportFilter<OdgGenerator>
+{
+public:
+ explicit MWAWDrawImportFilter(const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdgGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
+ OdgGenerator& rGenerator, utl::MediaDescriptor&) override;
+ virtual void doRegisterHandlers(OdgGenerator& rGenerator) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/draw/PageMakerImportFilter.cxx b/writerperfect/source/draw/PageMakerImportFilter.cxx
new file mode 100644
index 000000000..5f5379de9
--- /dev/null
+++ b/writerperfect/source/draw/PageMakerImportFilter.cxx
@@ -0,0 +1,56 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* PageMakerImportFilter: Sets up the filter, and calls OdgExporter
+ * to do the actual filtering
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <libpagemaker/libpagemaker.h>
+
+#include <cppuhelper/supportsservice.hxx>
+
+#include "PageMakerImportFilter.hxx"
+
+bool PageMakerImportFilter::doImportDocument(weld::Window*, librevenge::RVNGInputStream& rInput,
+ OdgGenerator& rGenerator, utl::MediaDescriptor&)
+{
+ return libpagemaker::PMDocument::parse(&rInput, &rGenerator);
+}
+
+bool PageMakerImportFilter::doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName)
+{
+ if (libpagemaker::PMDocument::isSupported(&rInput))
+ {
+ rTypeName = "draw_PageMaker_Document";
+ return true;
+ }
+
+ return false;
+}
+
+// XServiceInfo
+OUString SAL_CALL PageMakerImportFilter::getImplementationName()
+{
+ return "org.libreoffice.comp.Draw.PageMakerImportFilter";
+}
+
+sal_Bool SAL_CALL PageMakerImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+css::uno::Sequence<OUString> SAL_CALL PageMakerImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+org_libreoffice_comp_Draw_PageMakerImportFilter_get_implementation(
+ css::uno::XComponentContext* const context, const css::uno::Sequence<css::uno::Any>&)
+{
+ return cppu::acquire(new PageMakerImportFilter(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/draw/PageMakerImportFilter.hxx b/writerperfect/source/draw/PageMakerImportFilter.hxx
new file mode 100644
index 000000000..a333924bf
--- /dev/null
+++ b/writerperfect/source/draw/PageMakerImportFilter.hxx
@@ -0,0 +1,40 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_DRAW_PAGEMAKERIMPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_DRAW_PAGEMAKERIMPORTFILTER_HXX
+
+#include <ImportFilter.hxx>
+
+#include <DocumentHandlerForOdg.hxx>
+
+/* This component will be instantiated for both import or export. Whether it calls
+ * setSourceDocument or setTargetDocument determines which Impl function the filter
+ * member calls */
+class PageMakerImportFilter : public writerperfect::ImportFilter<OdgGenerator>
+{
+public:
+ explicit PageMakerImportFilter(
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdgGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
+ OdgGenerator& rGenerator, utl::MediaDescriptor&) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/draw/QXPImportFilter.cxx b/writerperfect/source/draw/QXPImportFilter.cxx
new file mode 100644
index 000000000..c644ad470
--- /dev/null
+++ b/writerperfect/source/draw/QXPImportFilter.cxx
@@ -0,0 +1,60 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* QXPImportFilter: Sets up the filter, and calls OdgExporter
+ * to do the actual filtering
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <libqxp/libqxp.h>
+
+#include <cppuhelper/supportsservice.hxx>
+
+#include "QXPImportFilter.hxx"
+
+using com::sun::star::uno::Sequence;
+using com::sun::star::uno::XComponentContext;
+using com::sun::star::uno::XInterface;
+
+bool QXPImportFilter::doImportDocument(weld::Window*, librevenge::RVNGInputStream& rInput,
+ OdgGenerator& rGenerator, utl::MediaDescriptor&)
+{
+ return libqxp::QXPDocument::parse(&rInput, &rGenerator) == libqxp::QXPDocument::RESULT_OK;
+}
+
+bool QXPImportFilter::doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName)
+{
+ if (libqxp::QXPDocument::isSupported(&rInput))
+ {
+ rTypeName = "draw_QXP_Document";
+ return true;
+ }
+
+ return false;
+}
+
+// XServiceInfo
+OUString SAL_CALL QXPImportFilter::getImplementationName()
+{
+ return "org.libreoffice.comp.Draw.QXPImportFilter";
+}
+
+sal_Bool SAL_CALL QXPImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+Sequence<OUString> SAL_CALL QXPImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+org_libreoffice_comp_Draw_QXPImportFilter_get_implementation(
+ css::uno::XComponentContext* const context, const css::uno::Sequence<css::uno::Any>&)
+{
+ return cppu::acquire(new QXPImportFilter(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/draw/QXPImportFilter.hxx b/writerperfect/source/draw/QXPImportFilter.hxx
new file mode 100644
index 000000000..8a2538b8b
--- /dev/null
+++ b/writerperfect/source/draw/QXPImportFilter.hxx
@@ -0,0 +1,39 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_DRAW_QXPIMPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_DRAW_QXPIMPORTFILTER_HXX
+
+#include <ImportFilter.hxx>
+
+#include <DocumentHandlerForOdg.hxx>
+
+/* This component will be instantiated for both import or export. Whether it calls
+ * setSourceDocument or setTargetDocument determines which Impl function the filter
+ * member calls */
+class QXPImportFilter : public writerperfect::ImportFilter<OdgGenerator>
+{
+public:
+ explicit QXPImportFilter(const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdgGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
+ OdgGenerator& rGenerator, utl::MediaDescriptor&) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/draw/StarOfficeDrawImportFilter.cxx b/writerperfect/source/draw/StarOfficeDrawImportFilter.cxx
new file mode 100644
index 000000000..1c335bfc4
--- /dev/null
+++ b/writerperfect/source/draw/StarOfficeDrawImportFilter.cxx
@@ -0,0 +1,101 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <cppuhelper/supportsservice.hxx>
+
+#include <libstaroffice/libstaroffice.hxx>
+
+#include "StarOfficeDrawImportFilter.hxx"
+
+using com::sun::star::uno::Sequence;
+using com::sun::star::uno::XComponentContext;
+using com::sun::star::uno::XInterface;
+
+static bool handleEmbeddedSTOFFGraphicObject(const librevenge::RVNGBinaryData& data,
+ OdfDocumentHandler* pHandler,
+ const OdfStreamType streamType)
+{
+ OdgGenerator exporter;
+ exporter.addDocumentHandler(pHandler, streamType);
+ return STOFFDocument::decodeGraphic(data, &exporter);
+}
+
+static bool handleEmbeddedSTOFFSpreadsheetObject(const librevenge::RVNGBinaryData& data,
+ OdfDocumentHandler* pHandler,
+ const OdfStreamType streamType)
+{
+ OdsGenerator exporter;
+ exporter.registerEmbeddedObjectHandler("image/stoff-odg", &handleEmbeddedSTOFFGraphicObject);
+ exporter.addDocumentHandler(pHandler, streamType);
+ return STOFFDocument::decodeSpreadsheet(data, &exporter);
+}
+
+bool StarOfficeDrawImportFilter::doImportDocument(weld::Window*,
+ librevenge::RVNGInputStream& rInput,
+ OdgGenerator& rGenerator, utl::MediaDescriptor&)
+{
+ return STOFFDocument::STOFF_R_OK == STOFFDocument::parse(&rInput, &rGenerator);
+}
+
+bool StarOfficeDrawImportFilter::doDetectFormat(librevenge::RVNGInputStream& rInput,
+ OUString& rTypeName)
+{
+ rTypeName.clear();
+
+ STOFFDocument::Kind docKind = STOFFDocument::STOFF_K_UNKNOWN;
+ const STOFFDocument::Confidence confidence
+ = STOFFDocument::isFileFormatSupported(&rInput, docKind);
+
+ if (confidence == STOFFDocument::STOFF_C_EXCELLENT
+ || confidence == STOFFDocument::STOFF_C_SUPPORTED_ENCRYPTION)
+ {
+ switch (docKind)
+ {
+ case STOFFDocument::STOFF_K_DRAW:
+ rTypeName = "StarOffice_Drawing";
+ break;
+ default:
+ break;
+ }
+ }
+
+ return !rTypeName.isEmpty();
+}
+
+void StarOfficeDrawImportFilter::doRegisterHandlers(OdgGenerator& rGenerator)
+{
+ rGenerator.registerEmbeddedObjectHandler("image/stoff-odg", &handleEmbeddedSTOFFGraphicObject);
+ rGenerator.registerEmbeddedObjectHandler("image/stoff-ods",
+ &handleEmbeddedSTOFFSpreadsheetObject);
+}
+
+// XServiceInfo
+OUString SAL_CALL StarOfficeDrawImportFilter::getImplementationName()
+{
+ return "org.libreoffice.comp.Draw.StarOfficeDrawImportFilter";
+}
+
+sal_Bool SAL_CALL StarOfficeDrawImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+Sequence<OUString> SAL_CALL StarOfficeDrawImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+org_libreoffice_comp_Draw_StarOfficeDrawImportFilter_get_implementation(
+ css::uno::XComponentContext* const context, const css::uno::Sequence<css::uno::Any>&)
+{
+ return cppu::acquire(new StarOfficeDrawImportFilter(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/draw/StarOfficeDrawImportFilter.hxx b/writerperfect/source/draw/StarOfficeDrawImportFilter.hxx
new file mode 100644
index 000000000..2526a96a9
--- /dev/null
+++ b/writerperfect/source/draw/StarOfficeDrawImportFilter.hxx
@@ -0,0 +1,45 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_DRAW_STAROFFICEDRAWIMPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_DRAW_STAROFFICEDRAWIMPORTFILTER_HXX
+
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+#include <ImportFilter.hxx>
+
+#include <DocumentHandlerForOdg.hxx>
+
+/* This component will be instantiated for both import or export. Whether it calls
+ * setSourceDocument or setTargetDocument determines which Impl function the filter
+ * member calls */
+class StarOfficeDrawImportFilter : public writerperfect::ImportFilter<OdgGenerator>
+{
+public:
+ explicit StarOfficeDrawImportFilter(
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdgGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
+ OdgGenerator& rGenerator, utl::MediaDescriptor&) override;
+ virtual void doRegisterHandlers(OdgGenerator& rGenerator) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/draw/VisioImportFilter.cxx b/writerperfect/source/draw/VisioImportFilter.cxx
new file mode 100644
index 000000000..33b23aae4
--- /dev/null
+++ b/writerperfect/source/draw/VisioImportFilter.cxx
@@ -0,0 +1,56 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* VisioImportFilter: Sets up the filter, and calls OdgExporter
+ * to do the actual filtering
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <cppuhelper/supportsservice.hxx>
+
+#include <libvisio/libvisio.h>
+
+#include "VisioImportFilter.hxx"
+
+bool VisioImportFilter::doImportDocument(weld::Window*, librevenge::RVNGInputStream& rInput,
+ OdgGenerator& rGenerator, utl::MediaDescriptor&)
+{
+ return libvisio::VisioDocument::parse(&rInput, &rGenerator);
+}
+
+bool VisioImportFilter::doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName)
+{
+ if (libvisio::VisioDocument::isSupported(&rInput))
+ {
+ rTypeName = "draw_Visio_Document";
+ return true;
+ }
+
+ return false;
+}
+
+// XServiceInfo
+OUString SAL_CALL VisioImportFilter::getImplementationName()
+{
+ return "com.sun.star.comp.Draw.VisioImportFilter";
+}
+
+sal_Bool SAL_CALL VisioImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+css::uno::Sequence<OUString> SAL_CALL VisioImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Draw_VisioImportFilter_get_implementation(
+ css::uno::XComponentContext* const context, const css::uno::Sequence<css::uno::Any>&)
+{
+ return cppu::acquire(new VisioImportFilter(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/draw/VisioImportFilter.hxx b/writerperfect/source/draw/VisioImportFilter.hxx
new file mode 100644
index 000000000..387827a4a
--- /dev/null
+++ b/writerperfect/source/draw/VisioImportFilter.hxx
@@ -0,0 +1,39 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_DRAW_VISIOIMPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_DRAW_VISIOIMPORTFILTER_HXX
+
+#include <ImportFilter.hxx>
+
+#include <DocumentHandlerForOdg.hxx>
+
+/* This component will be instantiated for both import or export. Whether it calls
+ * setSourceDocument or setTargetDocument determines which Impl function the filter
+ * member calls */
+class VisioImportFilter : public writerperfect::ImportFilter<OdgGenerator>
+{
+public:
+ explicit VisioImportFilter(const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdgGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
+ OdgGenerator& rGenerator, utl::MediaDescriptor&) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/draw/WPGImportFilter.cxx b/writerperfect/source/draw/WPGImportFilter.cxx
new file mode 100644
index 000000000..10411ea3b
--- /dev/null
+++ b/writerperfect/source/draw/WPGImportFilter.cxx
@@ -0,0 +1,62 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* WPGImportFilter: Sets up the filter, and calls OdgExporter
+ * to do the actual filtering
+ *
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+/* "This product is not manufactured, approved, or supported by
+ * Corel Corporation or Corel Corporation Limited."
+ */
+
+#include <cppuhelper/supportsservice.hxx>
+
+#include <libwpg/libwpg.h>
+
+#include "WPGImportFilter.hxx"
+
+bool WPGImportFilter::doImportDocument(weld::Window*, librevenge::RVNGInputStream& rInput,
+ OdgGenerator& rGenerator, utl::MediaDescriptor&)
+{
+ return libwpg::WPGraphics::parse(&rInput, &rGenerator);
+}
+
+bool WPGImportFilter::doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName)
+{
+ if (libwpg::WPGraphics::isSupported(&rInput))
+ {
+ rTypeName = "draw_WordPerfect_Graphics";
+ return true;
+ }
+
+ return false;
+}
+
+// XServiceInfo
+OUString SAL_CALL WPGImportFilter::getImplementationName()
+{
+ return "com.sun.star.comp.Draw.WPGImportFilter";
+}
+
+sal_Bool SAL_CALL WPGImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+css::uno::Sequence<OUString> SAL_CALL WPGImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Draw_WPGImportFilter_get_implementation(
+ css::uno::XComponentContext* const context, const css::uno::Sequence<css::uno::Any>&)
+{
+ return cppu::acquire(new WPGImportFilter(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/draw/WPGImportFilter.hxx b/writerperfect/source/draw/WPGImportFilter.hxx
new file mode 100644
index 000000000..3e75f08ee
--- /dev/null
+++ b/writerperfect/source/draw/WPGImportFilter.hxx
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+/* "This product is not manufactured, approved, or supported by
+ * Corel Corporation or Corel Corporation Limited."
+ */
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_DRAW_WPGIMPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_DRAW_WPGIMPORTFILTER_HXX
+
+#include <ImportFilter.hxx>
+
+#include <DocumentHandlerForOdg.hxx>
+
+/* This component will be instantiated for both import or export. Whether it calls
+ * setSourceDocument or setTargetDocument determines which Impl function the filter
+ * member calls */
+class WPGImportFilter : public writerperfect::ImportFilter<OdgGenerator>
+{
+public:
+ explicit WPGImportFilter(const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdgGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
+ OdgGenerator& rGenerator, utl::MediaDescriptor&) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/draw/ZMFImportFilter.cxx b/writerperfect/source/draw/ZMFImportFilter.cxx
new file mode 100644
index 000000000..0d1f16c97
--- /dev/null
+++ b/writerperfect/source/draw/ZMFImportFilter.cxx
@@ -0,0 +1,60 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* ZMFImportFilter: Sets up the filter, and calls OdgExporter
+ * to do the actual filtering
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <libzmf/libzmf.h>
+
+#include <cppuhelper/supportsservice.hxx>
+
+#include "ZMFImportFilter.hxx"
+
+using com::sun::star::uno::Sequence;
+using com::sun::star::uno::XComponentContext;
+using com::sun::star::uno::XInterface;
+
+bool ZMFImportFilter::doImportDocument(weld::Window*, librevenge::RVNGInputStream& rInput,
+ OdgGenerator& rGenerator, utl::MediaDescriptor&)
+{
+ return libzmf::ZMFDocument::parse(&rInput, &rGenerator);
+}
+
+bool ZMFImportFilter::doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName)
+{
+ if (libzmf::ZMFDocument::isSupported(&rInput))
+ {
+ rTypeName = "draw_ZMF_Document";
+ return true;
+ }
+
+ return false;
+}
+
+// XServiceInfo
+OUString SAL_CALL ZMFImportFilter::getImplementationName()
+{
+ return "org.libreoffice.comp.Draw.ZMFImportFilter";
+}
+
+sal_Bool SAL_CALL ZMFImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+Sequence<OUString> SAL_CALL ZMFImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+org_libreoffice_comp_Draw_ZMFImportFilter_get_implementation(
+ css::uno::XComponentContext* const context, const css::uno::Sequence<css::uno::Any>&)
+{
+ return cppu::acquire(new ZMFImportFilter(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/draw/ZMFImportFilter.hxx b/writerperfect/source/draw/ZMFImportFilter.hxx
new file mode 100644
index 000000000..6fef0180d
--- /dev/null
+++ b/writerperfect/source/draw/ZMFImportFilter.hxx
@@ -0,0 +1,39 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_DRAW_ZMFIMPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_DRAW_ZMFIMPORTFILTER_HXX
+
+#include <ImportFilter.hxx>
+
+#include <DocumentHandlerForOdg.hxx>
+
+/* This component will be instantiated for both import or export. Whether it calls
+ * setSourceDocument or setTargetDocument determines which Impl function the filter
+ * member calls */
+class ZMFImportFilter : public writerperfect::ImportFilter<OdgGenerator>
+{
+public:
+ explicit ZMFImportFilter(const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdgGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
+ OdgGenerator& rGenerator, utl::MediaDescriptor&) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/draw/wpftdraw.component b/writerperfect/source/draw/wpftdraw.component
new file mode 100644
index 000000000..1f9ced75a
--- /dev/null
+++ b/writerperfect/source/draw/wpftdraw.component
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+-->
+<component loader="com.sun.star.loader.SharedLibrary" environment="@CPPU_ENV@"
+ xmlns="http://openoffice.org/2010/uno-components">
+ <implementation name="com.sun.star.comp.Draw.CDRImportFilter"
+ constructor="com_sun_star_comp_Draw_CDRImportFilter_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ <service name="com.sun.star.document.ExtendedTypeDetection"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Draw.CMXImportFilter"
+ constructor="com_sun_star_comp_Draw_CMXImportFilter_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ <service name="com.sun.star.document.ExtendedTypeDetection"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Draw.FreehandImportFilter"
+ constructor="com_sun_star_comp_Draw_FreehandImportFilter_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ <service name="com.sun.star.document.ExtendedTypeDetection"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Draw.MSPUBImportFilter"
+ constructor="com_sun_star_comp_Draw_MSPUBImportFilter_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ <service name="com.sun.star.document.ExtendedTypeDetection"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Draw.MWAWDrawImportFilter"
+ constructor="com_sun_star_comp_Draw_MWAWDrawImportFilter_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ <service name="com.sun.star.document.ExtendedTypeDetection"/>
+ </implementation>
+ <implementation name="org.libreoffice.comp.Draw.StarOfficeDrawImportFilter"
+ constructor="org_libreoffice_comp_Draw_StarOfficeDrawImportFilter_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ <service name="com.sun.star.document.ExtendedTypeDetection"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Draw.VisioImportFilter"
+ constructor="com_sun_star_comp_Draw_VisioImportFilter_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ <service name="com.sun.star.document.ExtendedTypeDetection"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Draw.WPGImportFilter"
+ constructor="com_sun_star_comp_Draw_WPGImportFilter_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ <service name="com.sun.star.document.ExtendedTypeDetection"/>
+ </implementation>
+ <implementation name="org.libreoffice.comp.Draw.PageMakerImportFilter"
+ constructor="org_libreoffice_comp_Draw_PageMakerImportFilter_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ <service name="com.sun.star.document.ExtendedTypeDetection"/>
+ </implementation>
+ <implementation name="org.libreoffice.comp.Draw.QXPImportFilter"
+ constructor="org_libreoffice_comp_Draw_QXPImportFilter_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ <service name="com.sun.star.document.ExtendedTypeDetection"/>
+ </implementation>
+ <implementation name="org.libreoffice.comp.Draw.ZMFImportFilter"
+ constructor="org_libreoffice_comp_Draw_ZMFImportFilter_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ <service name="com.sun.star.document.ExtendedTypeDetection"/>
+ </implementation>
+</component>
diff --git a/writerperfect/source/impress/KeynoteImportFilter.cxx b/writerperfect/source/impress/KeynoteImportFilter.cxx
new file mode 100644
index 000000000..c212c5ab8
--- /dev/null
+++ b/writerperfect/source/impress/KeynoteImportFilter.cxx
@@ -0,0 +1,247 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* KeynoteImportFilter: Sets up the filter, and calls OdpExporter
+ * to do the actual filtering
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <memory>
+#include <com/sun/star/beans/NamedValue.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/io/XInputStream.hpp>
+#include <com/sun/star/uno/Reference.h>
+#include <com/sun/star/ucb/XContent.hpp>
+#include <comphelper/processfactory.hxx>
+#include <cppuhelper/supportsservice.hxx>
+
+#include <libetonyek/libetonyek.h>
+#include <ucbhelper/content.hxx>
+#include <unotools/ucbhelper.hxx>
+
+#include <DirectoryStream.hxx>
+#include <DocumentHandler.hxx>
+#include <WPXSvInputStream.hxx>
+
+#include "KeynoteImportFilter.hxx"
+
+using writerperfect::WPXSvInputStream;
+
+namespace beans = com::sun::star::beans;
+namespace ucb = com::sun::star::ucb;
+
+bool KeynoteImportFilter::doImportDocument(weld::Window*, librevenge::RVNGInputStream& rInput,
+ OdpGenerator& rGenerator, utl::MediaDescriptor&)
+{
+ return libetonyek::EtonyekDocument::parse(&rInput, &rGenerator);
+}
+
+bool KeynoteImportFilter::doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName)
+{
+ if (libetonyek::EtonyekDocument::isSupported(&rInput))
+ {
+ rTypeName = "impress_Keynote_Document";
+ return true;
+ }
+
+ return false;
+}
+
+// XExtendedFilterDetection
+OUString SAL_CALL
+KeynoteImportFilter::detect(css::uno::Sequence<css::beans::PropertyValue>& Descriptor)
+{
+ sal_Int32 nLength = Descriptor.getLength();
+ sal_Int32 nNewLength = nLength + 2;
+ sal_Int32 nComponentDataLocation = -1;
+ sal_Int32 nTypeNameLocation = -1;
+ sal_Int32 nUCBContentLocation = -1;
+ bool bIsPackage = false;
+ bool bUCBContentChanged = false;
+ const beans::PropertyValue* pValue = Descriptor.getConstArray();
+ css::uno::Reference<com::sun::star::io::XInputStream> xInputStream;
+ css::uno::Reference<ucb::XContent> xContent;
+ css::uno::Sequence<beans::NamedValue> lComponentDataNV;
+ css::uno::Sequence<beans::PropertyValue> lComponentDataPV;
+ bool bComponentDataNV = true;
+
+ for (sal_Int32 i = 0; i < nLength; i++)
+ {
+ if (pValue[i].Name == "TypeName")
+ {
+ nTypeNameLocation = i;
+ --nNewLength;
+ }
+ if (pValue[i].Name == "ComponentData")
+ {
+ bComponentDataNV = pValue[i].Value >>= lComponentDataNV;
+ if (!bComponentDataNV)
+ pValue[i].Value >>= lComponentDataPV;
+ nComponentDataLocation = i;
+ --nNewLength;
+ }
+ else if (pValue[i].Name == "InputStream")
+ {
+ pValue[i].Value >>= xInputStream;
+ }
+ else if (pValue[i].Name == "UCBContent")
+ {
+ pValue[i].Value >>= xContent;
+ nUCBContentLocation = i;
+ }
+ }
+
+ assert(nNewLength >= nLength);
+
+ if (!xInputStream.is())
+ return OUString();
+
+ std::unique_ptr<librevenge::RVNGInputStream> input
+ = std::make_unique<WPXSvInputStream>(xInputStream);
+
+ /* Apple Keynote documents come in two variants:
+ * * actual files (zip), only produced by Keynote 5 (at least with
+ * default settings)
+ * * packages (IOW, directories), produced by Keynote 1-4 and again
+ * starting with 6.
+ * But since the libetonyek import only works with a stream, we need
+ * to pass it one for the whole package. Here we determine if that
+ * is needed.
+ *
+ * Note: for convenience, we also recognize that the main XML file
+ * from a package was passed and pass the whole package to the
+ * filter instead.
+ */
+ if (xContent.is())
+ {
+ ucbhelper::Content aContent(xContent, utl::UCBContentHelper::getDefaultCommandEnvironment(),
+ comphelper::getProcessComponentContext());
+ try
+ {
+ if (aContent.isFolder())
+ {
+ input = std::make_unique<writerperfect::DirectoryStream>(xContent);
+ bIsPackage = true;
+ }
+ }
+ catch (...)
+ {
+ return OUString();
+ }
+ }
+
+ libetonyek::EtonyekDocument::Type type = libetonyek::EtonyekDocument::TYPE_UNKNOWN;
+ const libetonyek::EtonyekDocument::Confidence confidence
+ = libetonyek::EtonyekDocument::isSupported(input.get(), &type);
+ if ((libetonyek::EtonyekDocument::CONFIDENCE_NONE == confidence)
+ || (libetonyek::EtonyekDocument::TYPE_KEYNOTE != type))
+ return OUString();
+
+ if (confidence == libetonyek::EtonyekDocument::CONFIDENCE_SUPPORTED_PART)
+ {
+ if (bIsPackage) // we passed a directory stream, but the filter claims it's APXL file?
+ return OUString();
+
+ std::unique_ptr<writerperfect::DirectoryStream> xDir
+ = writerperfect::DirectoryStream::createForParent(xContent);
+ auto pDir = xDir.get();
+ input = std::move(xDir);
+ if (bool(input))
+ {
+ if (libetonyek::EtonyekDocument::CONFIDENCE_EXCELLENT
+ == libetonyek::EtonyekDocument::isSupported(input.get()))
+ {
+ xContent = pDir->getContent();
+ bUCBContentChanged = true;
+ bIsPackage = true;
+ }
+ else
+ {
+ // The passed stream has been detected as APXL file, but its parent dir is not a valid Keynote
+ // package? Something is wrong here...
+ return OUString();
+ }
+ }
+ }
+
+ // we do not need to insert ComponentData if this is not a package
+ if (!bIsPackage && (nComponentDataLocation == -1))
+ --nNewLength;
+
+ if (nNewLength > nLength)
+ Descriptor.realloc(nNewLength);
+
+ if (nTypeNameLocation == -1)
+ {
+ assert(nLength < nNewLength);
+ nTypeNameLocation = nLength++;
+ Descriptor[nTypeNameLocation].Name = "TypeName";
+ }
+
+ if (bIsPackage && (nComponentDataLocation == -1))
+ {
+ assert(nLength < nNewLength);
+ nComponentDataLocation = nLength++;
+ Descriptor[nComponentDataLocation].Name = "ComponentData";
+ }
+
+ if (bIsPackage)
+ {
+ if (bComponentDataNV)
+ {
+ const sal_Int32 nCDSize = lComponentDataNV.getLength();
+ lComponentDataNV.realloc(nCDSize + 1);
+ beans::NamedValue aValue;
+ aValue.Name = "IsPackage";
+ aValue.Value <<= true;
+ lComponentDataNV[nCDSize] = aValue;
+ Descriptor[nComponentDataLocation].Value <<= lComponentDataNV;
+ }
+ else
+ {
+ const sal_Int32 nCDSize = lComponentDataPV.getLength();
+ lComponentDataPV.realloc(nCDSize + 1);
+ beans::PropertyValue aProp;
+ aProp.Name = "IsPackage";
+ aProp.Value <<= true;
+ aProp.Handle = -1;
+ aProp.State = beans::PropertyState_DIRECT_VALUE;
+ lComponentDataPV[nCDSize] = aProp;
+ Descriptor[nComponentDataLocation].Value <<= lComponentDataPV;
+ }
+ }
+
+ if (bUCBContentChanged)
+ Descriptor[nUCBContentLocation].Value <<= xContent;
+
+ const OUString sTypeName("impress_AppleKeynote");
+ Descriptor[nTypeNameLocation].Value <<= sTypeName;
+
+ return sTypeName;
+}
+
+// XServiceInfo
+OUString SAL_CALL KeynoteImportFilter::getImplementationName()
+{
+ return "org.libreoffice.comp.Impress.KeynoteImportFilter";
+}
+
+sal_Bool SAL_CALL KeynoteImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+css::uno::Sequence<OUString> SAL_CALL KeynoteImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+org_libreoffice_comp_Impress_KeynoteImportFilter_get_implementation(
+ css::uno::XComponentContext* const context, const css::uno::Sequence<css::uno::Any>&)
+{
+ return cppu::acquire(new KeynoteImportFilter(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/impress/KeynoteImportFilter.hxx b/writerperfect/source/impress/KeynoteImportFilter.hxx
new file mode 100644
index 000000000..1ae6002a5
--- /dev/null
+++ b/writerperfect/source/impress/KeynoteImportFilter.hxx
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_IMPRESS_KEYNOTEIMPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_IMPRESS_KEYNOTEIMPORTFILTER_HXX
+
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+#include <ImportFilter.hxx>
+#include <DocumentHandlerForOdp.hxx>
+
+/* This component will be instantiated for both import or export. Whether it calls
+ * setSourceDocument or setTargetDocument determines which Impl function the filter
+ * member calls */
+class KeynoteImportFilter : public writerperfect::ImportFilter<OdpGenerator>
+{
+public:
+ explicit KeynoteImportFilter(const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdpGenerator>(rxContext)
+ {
+ }
+
+ //XExtendedFilterDetection
+ virtual OUString SAL_CALL
+ detect(css::uno::Sequence<css::beans::PropertyValue>& Descriptor) override;
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
+ OdpGenerator& rGenerator, utl::MediaDescriptor&) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/impress/MWAWPresentationImportFilter.cxx b/writerperfect/source/impress/MWAWPresentationImportFilter.cxx
new file mode 100644
index 000000000..c5de6984a
--- /dev/null
+++ b/writerperfect/source/impress/MWAWPresentationImportFilter.cxx
@@ -0,0 +1,104 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* MWAWPresentationImportFilter: Sets up the filter, and calls DocumentCollector
+ * to do the actual filtering
+ *
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <cppuhelper/supportsservice.hxx>
+
+#include <libmwaw/libmwaw.hxx>
+
+#include "MWAWPresentationImportFilter.hxx"
+
+static bool handleEmbeddedMWAWGraphicObject(const librevenge::RVNGBinaryData& data,
+ OdfDocumentHandler* pHandler,
+ const OdfStreamType streamType)
+{
+ OdgGenerator exporter;
+ exporter.addDocumentHandler(pHandler, streamType);
+ return MWAWDocument::decodeGraphic(data, &exporter);
+}
+
+static bool handleEmbeddedMWAWSpreadsheetObject(const librevenge::RVNGBinaryData& data,
+ OdfDocumentHandler* pHandler,
+ const OdfStreamType streamType)
+{
+ OdsGenerator exporter;
+ exporter.registerEmbeddedObjectHandler("image/mwaw-odg", &handleEmbeddedMWAWGraphicObject);
+ exporter.addDocumentHandler(pHandler, streamType);
+ return MWAWDocument::decodeSpreadsheet(data, &exporter);
+}
+
+bool MWAWPresentationImportFilter::doImportDocument(weld::Window*,
+ librevenge::RVNGInputStream& rInput,
+ OdpGenerator& rGenerator, utl::MediaDescriptor&)
+{
+ return MWAWDocument::MWAW_R_OK == MWAWDocument::parse(&rInput, &rGenerator);
+}
+
+bool MWAWPresentationImportFilter::doDetectFormat(librevenge::RVNGInputStream& rInput,
+ OUString& rTypeName)
+{
+ rTypeName.clear();
+
+ MWAWDocument::Type docType = MWAWDocument::MWAW_T_UNKNOWN;
+ MWAWDocument::Kind docKind = MWAWDocument::MWAW_K_UNKNOWN;
+ const MWAWDocument::Confidence confidence
+ = MWAWDocument::isFileFormatSupported(&rInput, docType, docKind);
+
+ if (confidence == MWAWDocument::MWAW_C_EXCELLENT)
+ {
+ if (docKind == MWAWDocument::MWAW_K_PRESENTATION)
+ {
+ switch (docType)
+ {
+ case MWAWDocument::MWAW_T_CLARISWORKS:
+ rTypeName = "impress_ClarisWorks";
+ break;
+ case MWAWDocument::MWAW_T_RESERVED8:
+ rTypeName = "impress_PowerPoint3";
+ break;
+ default:
+ rTypeName = "MWAW_Presentation";
+ break;
+ }
+ }
+ }
+
+ return !rTypeName.isEmpty();
+}
+
+void MWAWPresentationImportFilter::doRegisterHandlers(OdpGenerator& rGenerator)
+{
+ rGenerator.registerEmbeddedObjectHandler("image/mwaw-odg", &handleEmbeddedMWAWGraphicObject);
+ rGenerator.registerEmbeddedObjectHandler("image/mwaw-ods",
+ &handleEmbeddedMWAWSpreadsheetObject);
+}
+
+// XServiceInfo
+OUString SAL_CALL MWAWPresentationImportFilter::getImplementationName()
+{
+ return "com.sun.star.comp.Impress.MWAWPresentationImportFilter";
+}
+sal_Bool SAL_CALL MWAWPresentationImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+css::uno::Sequence<OUString> SAL_CALL MWAWPresentationImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Impress_MWAWPresentationImportFilter_get_implementation(
+ css::uno::XComponentContext* const context, const css::uno::Sequence<css::uno::Any>&)
+{
+ return cppu::acquire(new MWAWPresentationImportFilter(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/impress/MWAWPresentationImportFilter.hxx b/writerperfect/source/impress/MWAWPresentationImportFilter.hxx
new file mode 100644
index 000000000..4bb1afb55
--- /dev/null
+++ b/writerperfect/source/impress/MWAWPresentationImportFilter.hxx
@@ -0,0 +1,45 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_IMPRESS_MWAWPRESENTATIONIMPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_IMPRESS_MWAWPRESENTATIONIMPORTFILTER_HXX
+
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+#include <ImportFilter.hxx>
+
+#include <DocumentHandlerForOdp.hxx>
+
+/* This component will be instantiated for both import or export. Whether it calls
+ * setSourceDocument or setTargetDocument determines which Impl function the filter
+ * member calls */
+class MWAWPresentationImportFilter : public writerperfect::ImportFilter<OdpGenerator>
+{
+public:
+ explicit MWAWPresentationImportFilter(
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdpGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
+ OdpGenerator& rGenerator, utl::MediaDescriptor&) override;
+ virtual void doRegisterHandlers(OdpGenerator& rGenerator) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/impress/StarOfficePresentationImportFilter.cxx b/writerperfect/source/impress/StarOfficePresentationImportFilter.cxx
new file mode 100644
index 000000000..4f60f57e3
--- /dev/null
+++ b/writerperfect/source/impress/StarOfficePresentationImportFilter.cxx
@@ -0,0 +1,102 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <cppuhelper/supportsservice.hxx>
+
+#include <libstaroffice/libstaroffice.hxx>
+
+#include "StarOfficePresentationImportFilter.hxx"
+
+using com::sun::star::uno::Sequence;
+using com::sun::star::uno::XComponentContext;
+using com::sun::star::uno::XInterface;
+
+static bool handleEmbeddedSTOFFGraphicObject(const librevenge::RVNGBinaryData& data,
+ OdfDocumentHandler* pHandler,
+ const OdfStreamType streamType)
+{
+ OdgGenerator exporter;
+ exporter.addDocumentHandler(pHandler, streamType);
+ return STOFFDocument::decodeGraphic(data, &exporter);
+}
+
+static bool handleEmbeddedSTOFFSpreadsheetObject(const librevenge::RVNGBinaryData& data,
+ OdfDocumentHandler* pHandler,
+ const OdfStreamType streamType)
+{
+ OdsGenerator exporter;
+ exporter.registerEmbeddedObjectHandler("image/stoff-odg", &handleEmbeddedSTOFFGraphicObject);
+ exporter.addDocumentHandler(pHandler, streamType);
+ return STOFFDocument::decodeSpreadsheet(data, &exporter);
+}
+
+bool StarOfficePresentationImportFilter::doImportDocument(weld::Window*,
+ librevenge::RVNGInputStream& rInput,
+ OdpGenerator& rGenerator,
+ utl::MediaDescriptor&)
+{
+ return STOFFDocument::STOFF_R_OK == STOFFDocument::parse(&rInput, &rGenerator);
+}
+
+bool StarOfficePresentationImportFilter::doDetectFormat(librevenge::RVNGInputStream& rInput,
+ OUString& rTypeName)
+{
+ rTypeName.clear();
+
+ STOFFDocument::Kind docKind = STOFFDocument::STOFF_K_UNKNOWN;
+ const STOFFDocument::Confidence confidence
+ = STOFFDocument::isFileFormatSupported(&rInput, docKind);
+
+ if (confidence == STOFFDocument::STOFF_C_EXCELLENT
+ || confidence == STOFFDocument::STOFF_C_SUPPORTED_ENCRYPTION)
+ {
+ switch (docKind)
+ {
+ case STOFFDocument::STOFF_K_PRESENTATION:
+ rTypeName = "StarOffice_Presentation";
+ break;
+ default:
+ break;
+ }
+ }
+
+ return !rTypeName.isEmpty();
+}
+
+void StarOfficePresentationImportFilter::doRegisterHandlers(OdpGenerator& rGenerator)
+{
+ rGenerator.registerEmbeddedObjectHandler("image/stoff-odg", &handleEmbeddedSTOFFGraphicObject);
+ rGenerator.registerEmbeddedObjectHandler("image/stoff-ods",
+ &handleEmbeddedSTOFFSpreadsheetObject);
+}
+
+// XServiceInfo
+OUString SAL_CALL StarOfficePresentationImportFilter::getImplementationName()
+{
+ return "org.libreoffice.comp.Impress.StarOfficePresentationImportFilter";
+}
+
+sal_Bool SAL_CALL StarOfficePresentationImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+Sequence<OUString> SAL_CALL StarOfficePresentationImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+org_libreoffice_comp_Presentation_StarOfficePresentationImportFilter_get_implementation(
+ css::uno::XComponentContext* const context, const css::uno::Sequence<css::uno::Any>&)
+{
+ return cppu::acquire(new StarOfficePresentationImportFilter(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/impress/StarOfficePresentationImportFilter.hxx b/writerperfect/source/impress/StarOfficePresentationImportFilter.hxx
new file mode 100644
index 000000000..7a5e6103a
--- /dev/null
+++ b/writerperfect/source/impress/StarOfficePresentationImportFilter.hxx
@@ -0,0 +1,45 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_PRESENTATION_STAROFFICEPRESENTATIONIMPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_PRESENTATION_STAROFFICEPRESENTATIONIMPORTFILTER_HXX
+
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+#include <ImportFilter.hxx>
+
+#include <DocumentHandlerForOdp.hxx>
+
+/* This component will be instantiated for both import or export. Whether it calls
+ * setSourceDocument or setTargetDocument determines which Impl function the filter
+ * member calls */
+class StarOfficePresentationImportFilter : public writerperfect::ImportFilter<OdpGenerator>
+{
+public:
+ explicit StarOfficePresentationImportFilter(
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdpGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
+ OdpGenerator& rGenerator, utl::MediaDescriptor&) override;
+ virtual void doRegisterHandlers(OdpGenerator& rGenerator) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/impress/wpftimpress.component b/writerperfect/source/impress/wpftimpress.component
new file mode 100644
index 000000000..0f7df39fa
--- /dev/null
+++ b/writerperfect/source/impress/wpftimpress.component
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+-->
+<component loader="com.sun.star.loader.SharedLibrary" environment="@CPPU_ENV@"
+ xmlns="http://openoffice.org/2010/uno-components">
+ <implementation name="org.libreoffice.comp.Impress.KeynoteImportFilter"
+ constructor="org_libreoffice_comp_Impress_KeynoteImportFilter_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ <service name="com.sun.star.document.ExtendedTypeDetection"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Impress.MWAWPresentationImportFilter"
+ constructor="com_sun_star_comp_Impress_MWAWPresentationImportFilter_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ <service name="com.sun.star.document.ExtendedTypeDetection"/>
+ </implementation>
+ <implementation name="org.libreoffice.comp.Impress.StarOfficePresentationImportFilter"
+ constructor="org_libreoffice_comp_Presentation_StarOfficePresentationImportFilter_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ <service name="com.sun.star.document.ExtendedTypeDetection"/>
+ </implementation>
+</component>
diff --git a/writerperfect/source/writer/AbiWordImportFilter.cxx b/writerperfect/source/writer/AbiWordImportFilter.cxx
new file mode 100644
index 000000000..0661604bc
--- /dev/null
+++ b/writerperfect/source/writer/AbiWordImportFilter.cxx
@@ -0,0 +1,58 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* AbiWordImportFilter: Sets up the filter, and calls DocumentCollector
+ * to do the actual filtering
+ *
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <cppuhelper/supportsservice.hxx>
+
+#include <libabw/libabw.h>
+
+#include "AbiWordImportFilter.hxx"
+
+bool AbiWordImportFilter::doImportDocument(weld::Window*, librevenge::RVNGInputStream& rInput,
+ OdtGenerator& rGenerator, utl::MediaDescriptor&)
+{
+ return libabw::AbiDocument::parse(&rInput, &rGenerator);
+}
+
+bool AbiWordImportFilter::doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName)
+{
+ if (libabw::AbiDocument::isFileFormatSupported(&rInput))
+ {
+ rTypeName = "writer_AbiWord_Document";
+ return true;
+ }
+
+ return false;
+}
+
+// XServiceInfo
+OUString SAL_CALL AbiWordImportFilter::getImplementationName()
+{
+ return "com.sun.star.comp.Writer.AbiWordImportFilter";
+}
+
+sal_Bool SAL_CALL AbiWordImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+css::uno::Sequence<OUString> SAL_CALL AbiWordImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Writer_AbiWordImportFilter_get_implementation(
+ css::uno::XComponentContext* const context, const css::uno::Sequence<css::uno::Any>&)
+{
+ return cppu::acquire(new AbiWordImportFilter(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/AbiWordImportFilter.hxx b/writerperfect/source/writer/AbiWordImportFilter.hxx
new file mode 100644
index 000000000..99fa0b30f
--- /dev/null
+++ b/writerperfect/source/writer/AbiWordImportFilter.hxx
@@ -0,0 +1,43 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_ABIWORDIMPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_ABIWORDIMPORTFILTER_HXX
+
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+#include <ImportFilter.hxx>
+
+#include <DocumentHandlerForOdt.hxx>
+
+/* This component will be instantiated for both import or export. Whether it calls
+ * setSourceDocument or setTargetDocument determines which Impl function the filter
+ * member calls */
+class AbiWordImportFilter : public writerperfect::ImportFilter<OdtGenerator>
+{
+public:
+ explicit AbiWordImportFilter(const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdtGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
+ OdtGenerator& rGenerator, utl::MediaDescriptor&) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/EBookImportFilter.cxx b/writerperfect/source/writer/EBookImportFilter.cxx
new file mode 100644
index 000000000..d734397bc
--- /dev/null
+++ b/writerperfect/source/writer/EBookImportFilter.cxx
@@ -0,0 +1,114 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* EBookImportFilter: Sets up the filter, and calls DocumentCollector
+ * to do the actual filtering
+ *
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <cppuhelper/supportsservice.hxx>
+#include <sal/log.hxx>
+
+#include <libe-book/libe-book.h>
+
+#include "EBookImportFilter.hxx"
+
+using libebook::EBOOKDocument;
+
+bool EBookImportFilter::doImportDocument(weld::Window*, librevenge::RVNGInputStream& rInput,
+ OdtGenerator& rGenerator,
+ utl::MediaDescriptor& rDescriptor)
+{
+ OUString aFilterName;
+
+ rDescriptor[utl::MediaDescriptor::PROP_FILTERNAME()] >>= aFilterName;
+ assert(!aFilterName.isEmpty());
+
+ if (aFilterName == "Palm_Text_Document")
+ {
+ return EBOOKDocument::RESULT_OK == EBOOKDocument::parse(&rInput, &rGenerator);
+ }
+ else
+ {
+ EBOOKDocument::Type type = EBOOKDocument::TYPE_UNKNOWN;
+
+ if (aFilterName == "BroadBand eBook")
+ type = EBOOKDocument::TYPE_BBEB;
+ else if (aFilterName == "FictionBook 2")
+ type = EBOOKDocument::TYPE_FICTIONBOOK2;
+ else if (aFilterName == "PalmDoc")
+ type = EBOOKDocument::TYPE_PALMDOC;
+ else if (aFilterName == "Plucker eBook")
+ type = EBOOKDocument::TYPE_PLUCKER;
+
+ if (EBOOKDocument::TYPE_UNKNOWN != type)
+ return EBOOKDocument::RESULT_OK == EBOOKDocument::parse(&rInput, &rGenerator, type);
+ }
+
+ return false;
+}
+
+bool EBookImportFilter::doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName)
+{
+ rTypeName.clear();
+
+ EBOOKDocument::Type type = EBOOKDocument::TYPE_UNKNOWN;
+
+ if (EBOOKDocument::CONFIDENCE_EXCELLENT == EBOOKDocument::isSupported(&rInput, &type))
+ {
+ switch (type)
+ {
+ case EBOOKDocument::TYPE_BBEB:
+ rTypeName = "writer_BroadBand_eBook";
+ break;
+ case EBOOKDocument::TYPE_FICTIONBOOK2:
+ rTypeName = "writer_FictionBook_2";
+ break;
+ case EBOOKDocument::TYPE_PALMDOC:
+ rTypeName = "writer_PalmDoc";
+ break;
+ case EBOOKDocument::TYPE_PLUCKER:
+ rTypeName = "writer_Plucker_eBook";
+ break;
+ case EBOOKDocument::TYPE_PEANUTPRESS:
+ case EBOOKDocument::TYPE_TEALDOC:
+ case EBOOKDocument::TYPE_ZTXT:
+ rTypeName = "Palm_Text_Document";
+ break;
+ default:
+ SAL_WARN_IF(type != EBOOKDocument::TYPE_UNKNOWN, "writerperfect",
+ "EBookImportFilter::doDetectFormat: document type "
+ << type << " detected, but ignored");
+ }
+ }
+
+ return !rTypeName.isEmpty();
+}
+
+// XServiceInfo
+OUString SAL_CALL EBookImportFilter::getImplementationName()
+{
+ return "org.libreoffice.comp.Writer.EBookImportFilter";
+}
+
+sal_Bool SAL_CALL EBookImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+css::uno::Sequence<OUString> SAL_CALL EBookImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+org_libreoffice_comp_Writer_EBookImportFilter_get_implementation(
+ css::uno::XComponentContext* const context, const css::uno::Sequence<css::uno::Any>&)
+{
+ return cppu::acquire(new EBookImportFilter(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/EBookImportFilter.hxx b/writerperfect/source/writer/EBookImportFilter.hxx
new file mode 100644
index 000000000..9ebdc9234
--- /dev/null
+++ b/writerperfect/source/writer/EBookImportFilter.hxx
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef EBOOKIMPORTFILTER_HXX
+#define EBOOKIMPORTFILTER_HXX
+
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+#include <ImportFilter.hxx>
+
+#include <DocumentHandlerForOdt.hxx>
+
+/* This component will be instantiated for both import or export. Whether it calls
+ * setSourceDocument or setTargetDocument determines which Impl function the filter
+ * member calls */
+class EBookImportFilter : public writerperfect::ImportFilter<OdtGenerator>
+{
+public:
+ explicit EBookImportFilter(const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdtGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
+ OdtGenerator& rGenerator,
+ utl::MediaDescriptor& rDescriptor) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/EPUBExportDialog.cxx b/writerperfect/source/writer/EPUBExportDialog.cxx
new file mode 100644
index 000000000..c26516d63
--- /dev/null
+++ b/writerperfect/source/writer/EPUBExportDialog.cxx
@@ -0,0 +1,223 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "EPUBExportDialog.hxx"
+
+#include <libepubgen/libepubgen.h>
+
+#include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
+#include <com/sun/star/ui/dialogs/FolderPicker.hpp>
+#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
+#include <comphelper/sequenceashashmap.hxx>
+#include <sfx2/opengrf.hxx>
+#include <sax/tools/converter.hxx>
+#include <i18nlangtag/languagetag.hxx>
+
+#include "EPUBExportFilter.hxx"
+
+using namespace com::sun::star;
+
+namespace
+{
+/// Converts version value to a listbox entry position.
+sal_Int32 VersionToPosition(sal_Int32 nVersion)
+{
+ sal_Int32 nPosition = 0;
+
+ switch (nVersion)
+ {
+ case 30:
+ nPosition = 0;
+ break;
+ case 20:
+ nPosition = 1;
+ break;
+ default:
+ assert(false);
+ break;
+ }
+
+ return nPosition;
+}
+
+/// Converts listbox entry position to a version value.
+sal_Int32 PositionToVersion(sal_Int32 nPosition)
+{
+ sal_Int32 nVersion = 0;
+
+ switch (nPosition)
+ {
+ case 0:
+ nVersion = 30;
+ break;
+ case 1:
+ nVersion = 20;
+ break;
+ default:
+ assert(false);
+ break;
+ }
+
+ return nVersion;
+}
+}
+
+namespace writerperfect
+{
+EPUBExportDialog::EPUBExportDialog(weld::Window* pParent,
+ comphelper::SequenceAsHashMap& rFilterData,
+ uno::Reference<uno::XComponentContext> xContext,
+ css::uno::Reference<css::lang::XComponent> xDocument)
+ : GenericDialogController(pParent, "writerperfect/ui/exportepub.ui", "EpubDialog")
+ , m_xContext(std::move(xContext))
+ , m_rFilterData(rFilterData)
+ , m_xSourceDocument(std::move(xDocument))
+ , m_xVersion(m_xBuilder->weld_combo_box("versionlb"))
+ , m_xSplit(m_xBuilder->weld_combo_box("splitlb"))
+ , m_xLayout(m_xBuilder->weld_combo_box("layoutlb"))
+ , m_xCoverPath(m_xBuilder->weld_entry("coverpath"))
+ , m_xCoverButton(m_xBuilder->weld_button("coverbutton"))
+ , m_xMediaDir(m_xBuilder->weld_entry("mediadir"))
+ , m_xMediaButton(m_xBuilder->weld_button("mediabutton"))
+ , m_xOKButton(m_xBuilder->weld_button("ok"))
+ , m_xIdentifier(m_xBuilder->weld_entry("identifier"))
+ , m_xTitle(m_xBuilder->weld_entry("title"))
+ , m_xInitialCreator(m_xBuilder->weld_entry("author"))
+ , m_xLanguage(m_xBuilder->weld_entry("language"))
+ , m_xDate(m_xBuilder->weld_entry("date"))
+
+{
+ assert(PositionToVersion(m_xVersion->get_active()) == EPUBExportFilter::GetDefaultVersion());
+
+ auto it = rFilterData.find("EPUBVersion");
+ if (it != rFilterData.end())
+ {
+ sal_Int32 nVersion = 0;
+ if (it->second >>= nVersion)
+ m_xVersion->set_active(VersionToPosition(nVersion));
+ }
+ m_xVersion->connect_changed(LINK(this, EPUBExportDialog, VersionSelectHdl));
+
+ it = rFilterData.find("EPUBSplitMethod");
+ if (it != rFilterData.end())
+ {
+ sal_Int32 nSplitMethod = 0;
+ if (it->second >>= nSplitMethod)
+ // No conversion, 1:1 mapping between libepubgen::EPUBSplitMethod
+ // and entry positions.
+ m_xSplit->set_active(nSplitMethod);
+ }
+ else
+ m_xSplit->set_active(EPUBExportFilter::GetDefaultSplitMethod());
+ m_xSplit->connect_changed(LINK(this, EPUBExportDialog, SplitSelectHdl));
+
+ it = rFilterData.find("EPUBLayoutMethod");
+ if (it != rFilterData.end())
+ {
+ sal_Int32 nLayoutMethod = 0;
+ if (it->second >>= nLayoutMethod)
+ // No conversion, 1:1 mapping between libepubgen::EPUBLayoutMethod
+ // and entry positions.
+ m_xLayout->set_active(nLayoutMethod);
+ }
+ else
+ m_xLayout->set_active(EPUBExportFilter::GetDefaultLayoutMethod());
+ m_xLayout->connect_changed(LINK(this, EPUBExportDialog, LayoutSelectHdl));
+
+ m_xCoverButton->connect_clicked(LINK(this, EPUBExportDialog, CoverClickHdl));
+
+ m_xMediaButton->connect_clicked(LINK(this, EPUBExportDialog, MediaClickHdl));
+
+ uno::Reference<document::XDocumentPropertiesSupplier> xDPS(m_xSourceDocument, uno::UNO_QUERY);
+ uno::Reference<document::XDocumentProperties> xDP;
+ if (xDPS.is())
+ xDP = xDPS->getDocumentProperties();
+ if (xDP.is())
+ {
+ m_xTitle->set_text(xDP->getTitle());
+ m_xInitialCreator->set_text(xDP->getAuthor());
+
+ OUString aLanguage(LanguageTag::convertToBcp47(xDP->getLanguage(), false));
+ m_xLanguage->set_text(aLanguage);
+
+ OUStringBuffer aBuffer;
+ util::DateTime aDate(xDP->getModificationDate());
+ sax::Converter::convertDateTime(aBuffer, aDate, nullptr, true);
+ m_xDate->set_text(aBuffer.makeStringAndClear());
+ }
+
+ m_xOKButton->connect_clicked(LINK(this, EPUBExportDialog, OKClickHdl));
+}
+
+IMPL_LINK_NOARG(EPUBExportDialog, VersionSelectHdl, weld::ComboBox&, void)
+{
+ m_rFilterData["EPUBVersion"] <<= PositionToVersion(m_xVersion->get_active());
+}
+
+IMPL_LINK_NOARG(EPUBExportDialog, SplitSelectHdl, weld::ComboBox&, void)
+{
+ // No conversion, 1:1 mapping between entry positions and
+ // libepubgen::EPUBSplitMethod.
+ m_rFilterData["EPUBSplitMethod"] <<= static_cast<sal_Int32>(m_xSplit->get_active());
+}
+
+IMPL_LINK_NOARG(EPUBExportDialog, LayoutSelectHdl, weld::ComboBox&, void)
+{
+ // No conversion, 1:1 mapping between entry positions and
+ // libepubgen::EPUBLayoutMethod.
+ m_rFilterData["EPUBLayoutMethod"] <<= static_cast<sal_Int32>(m_xLayout->get_active());
+ m_xSplit->set_sensitive(m_xLayout->get_active() != libepubgen::EPUB_LAYOUT_METHOD_FIXED);
+}
+
+IMPL_LINK_NOARG(EPUBExportDialog, CoverClickHdl, weld::Button&, void)
+{
+ SvxOpenGraphicDialog aDlg("Import", m_xDialog.get());
+ aDlg.EnableLink(false);
+ if (aDlg.Execute() == ERRCODE_NONE)
+ m_xCoverPath->set_text(aDlg.GetPath());
+}
+
+IMPL_LINK_NOARG(EPUBExportDialog, MediaClickHdl, weld::Button&, void)
+{
+ uno::Reference<ui::dialogs::XFolderPicker2> xFolderPicker
+ = ui::dialogs::FolderPicker::create(m_xContext);
+ if (xFolderPicker->execute() != ui::dialogs::ExecutableDialogResults::OK)
+ return;
+
+ m_xMediaDir->set_text(xFolderPicker->getDirectory());
+}
+
+IMPL_LINK_NOARG(EPUBExportDialog, OKClickHdl, weld::Button&, void)
+{
+ // General
+ if (!m_xCoverPath->get_text().isEmpty())
+ m_rFilterData["RVNGCoverImage"] <<= m_xCoverPath->get_text();
+ if (!m_xMediaDir->get_text().isEmpty())
+ m_rFilterData["RVNGMediaDir"] <<= m_xMediaDir->get_text();
+
+ // Metadata
+ if (!m_xIdentifier->get_text().isEmpty())
+ m_rFilterData["RVNGIdentifier"] <<= m_xIdentifier->get_text();
+ if (!m_xTitle->get_text().isEmpty())
+ m_rFilterData["RVNGTitle"] <<= m_xTitle->get_text();
+ if (!m_xInitialCreator->get_text().isEmpty())
+ m_rFilterData["RVNGInitialCreator"] <<= m_xInitialCreator->get_text();
+ if (!m_xLanguage->get_text().isEmpty())
+ m_rFilterData["RVNGLanguage"] <<= m_xLanguage->get_text();
+ if (!m_xDate->get_text().isEmpty())
+ m_rFilterData["RVNGDate"] <<= m_xDate->get_text();
+
+ m_xDialog->response(RET_OK);
+}
+
+EPUBExportDialog::~EPUBExportDialog() = default;
+
+} // namespace writerperfect
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/EPUBExportDialog.hxx b/writerperfect/source/writer/EPUBExportDialog.hxx
new file mode 100644
index 000000000..50a6de75e
--- /dev/null
+++ b/writerperfect/source/writer/EPUBExportDialog.hxx
@@ -0,0 +1,64 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_EPUBEXPORTDIALOG_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_EPUBEXPORTDIALOG_HXX
+
+#include <vcl/weld.hxx>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+
+namespace comphelper
+{
+class SequenceAsHashMap;
+}
+
+namespace writerperfect
+{
+/// EPUB export options dialog.
+class EPUBExportDialog : public weld::GenericDialogController
+{
+public:
+ EPUBExportDialog(weld::Window* pParent, comphelper::SequenceAsHashMap& rFilterData,
+ css::uno::Reference<css::uno::XComponentContext> xContext,
+ css::uno::Reference<css::lang::XComponent> xDocument);
+ ~EPUBExportDialog() override;
+
+private:
+ DECL_LINK(VersionSelectHdl, weld::ComboBox&, void);
+ DECL_LINK(SplitSelectHdl, weld::ComboBox&, void);
+ DECL_LINK(LayoutSelectHdl, weld::ComboBox&, void);
+ DECL_LINK(CoverClickHdl, weld::Button&, void);
+ DECL_LINK(MediaClickHdl, weld::Button&, void);
+ DECL_LINK(OKClickHdl, weld::Button&, void);
+
+ css::uno::Reference<css::uno::XComponentContext> m_xContext;
+ comphelper::SequenceAsHashMap& m_rFilterData;
+ css::uno::Reference<css::lang::XComponent> m_xSourceDocument;
+
+ std::unique_ptr<weld::ComboBox> m_xVersion;
+ std::unique_ptr<weld::ComboBox> m_xSplit;
+ std::unique_ptr<weld::ComboBox> m_xLayout;
+ std::unique_ptr<weld::Entry> m_xCoverPath;
+ std::unique_ptr<weld::Button> m_xCoverButton;
+ std::unique_ptr<weld::Entry> m_xMediaDir;
+ std::unique_ptr<weld::Button> m_xMediaButton;
+ std::unique_ptr<weld::Button> m_xOKButton;
+ std::unique_ptr<weld::Entry> m_xIdentifier;
+ std::unique_ptr<weld::Entry> m_xTitle;
+ std::unique_ptr<weld::Entry> m_xInitialCreator;
+ std::unique_ptr<weld::Entry> m_xLanguage;
+ std::unique_ptr<weld::Entry> m_xDate;
+};
+
+} // namespace writerperfect
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/EPUBExportFilter.cxx b/writerperfect/source/writer/EPUBExportFilter.cxx
new file mode 100644
index 000000000..d944b080d
--- /dev/null
+++ b/writerperfect/source/writer/EPUBExportFilter.cxx
@@ -0,0 +1,205 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "EPUBExportFilter.hxx"
+
+#include <libepubgen/EPUBTextGenerator.h>
+#include <libepubgen/libepubgen-decls.h>
+
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/frame/XModel.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/text/XPageCursor.hpp>
+#include <com/sun/star/text/XTextViewCursorSupplier.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+#include <comphelper/genericpropertyset.hxx>
+#include <comphelper/propertysetinfo.hxx>
+#include <cppuhelper/supportsservice.hxx>
+#include <svtools/DocumentToGraphicRenderer.hxx>
+#include <vcl/gdimtf.hxx>
+#include <tools/stream.hxx>
+
+#include "exp/xmlimp.hxx"
+#include "EPUBPackage.hxx"
+
+using namespace com::sun::star;
+
+namespace writerperfect
+{
+EPUBExportFilter::EPUBExportFilter(uno::Reference<uno::XComponentContext> xContext)
+ : mxContext(std::move(xContext))
+{
+}
+
+sal_Int32 EPUBExportFilter::GetDefaultVersion() { return 30; }
+
+sal_Int32 EPUBExportFilter::GetDefaultSplitMethod()
+{
+ return libepubgen::EPUB_SPLIT_METHOD_HEADING;
+}
+
+sal_Int32 EPUBExportFilter::GetDefaultLayoutMethod()
+{
+ return libepubgen::EPUB_LAYOUT_METHOD_REFLOWABLE;
+}
+
+sal_Bool EPUBExportFilter::filter(const uno::Sequence<beans::PropertyValue>& rDescriptor)
+{
+ sal_Int32 nVersion = EPUBExportFilter::GetDefaultVersion();
+ sal_Int32 nSplitMethod = EPUBExportFilter::GetDefaultSplitMethod();
+ sal_Int32 nLayoutMethod = EPUBExportFilter::GetDefaultLayoutMethod();
+ uno::Sequence<beans::PropertyValue> aFilterData;
+ OUString aFilterOptions;
+ for (const auto& rProp : rDescriptor)
+ {
+ if (rProp.Name == "FilterData")
+ rProp.Value >>= aFilterData;
+ else if (rProp.Name == "FilterOptions")
+ rProp.Value >>= aFilterOptions;
+ }
+
+ if (aFilterOptions == "layout=fixed")
+ nLayoutMethod = libepubgen::EPUB_LAYOUT_METHOD_FIXED;
+
+ for (const auto& rProp : std::as_const(aFilterData))
+ {
+ if (rProp.Name == "EPUBVersion")
+ rProp.Value >>= nVersion;
+ else if (rProp.Name == "EPUBSplitMethod")
+ rProp.Value >>= nSplitMethod;
+ else if (rProp.Name == "EPUBLayoutMethod")
+ rProp.Value >>= nLayoutMethod;
+ }
+
+ // Build the export filter chain: the package has direct access to the ZIP
+ // file, the flat ODF filter has access to the doc model, everything else
+ // is in-between.
+ EPUBPackage aPackage(mxContext, rDescriptor);
+ libepubgen::EPUBTextGenerator aGenerator(&aPackage, nVersion);
+ aGenerator.setOption(libepubgen::EPUB_GENERATOR_OPTION_SPLIT, nSplitMethod);
+ aGenerator.setOption(libepubgen::EPUB_GENERATOR_OPTION_LAYOUT, nLayoutMethod);
+ OUString aSourceURL;
+ uno::Reference<frame::XModel> xSourceModel(mxSourceDocument, uno::UNO_QUERY);
+ if (xSourceModel.is())
+ aSourceURL = xSourceModel->getURL();
+
+ std::vector<exp::FixedLayoutPage> aPageMetafiles;
+ if (nLayoutMethod == libepubgen::EPUB_LAYOUT_METHOD_FIXED)
+ CreateMetafiles(aPageMetafiles);
+
+ uno::Reference<xml::sax::XDocumentHandler> xExportHandler(
+ new exp::XMLImport(mxContext, aGenerator, aSourceURL, rDescriptor, aPageMetafiles));
+
+ uno::Reference<lang::XInitialization> xInitialization(
+ mxContext->getServiceManager()->createInstanceWithContext(
+ "com.sun.star.comp.Writer.XMLOasisExporter", mxContext),
+ uno::UNO_QUERY);
+
+ // A subset of parameters are passed in as a property set.
+ comphelper::PropertyMapEntry const aInfoMap[]
+ = { { OUString("BaseURI"), 0, cppu::UnoType<OUString>::get(),
+ beans::PropertyAttribute::MAYBEVOID, 0 },
+ { OUString(), 0, uno::Type(), 0, 0 } };
+ uno::Reference<beans::XPropertySet> xInfoSet(
+ comphelper::GenericPropertySet_CreateInstance(new comphelper::PropertySetInfo(aInfoMap)));
+ xInfoSet->setPropertyValue("BaseURI", uno::makeAny(aSourceURL));
+
+ xInitialization->initialize({ uno::makeAny(xExportHandler), uno::makeAny(xInfoSet) });
+ uno::Reference<document::XExporter> xExporter(xInitialization, uno::UNO_QUERY);
+ xExporter->setSourceDocument(mxSourceDocument);
+ uno::Reference<document::XFilter> xFilter(xInitialization, uno::UNO_QUERY);
+
+ return xFilter->filter(rDescriptor);
+}
+
+void EPUBExportFilter::CreateMetafiles(std::vector<exp::FixedLayoutPage>& rPageMetafiles)
+{
+ DocumentToGraphicRenderer aRenderer(mxSourceDocument, /*bSelectionOnly=*/false);
+ uno::Reference<frame::XModel> xModel(mxSourceDocument, uno::UNO_QUERY);
+ if (!xModel.is())
+ return;
+
+ uno::Reference<text::XTextViewCursorSupplier> xTextViewCursorSupplier(
+ xModel->getCurrentController(), uno::UNO_QUERY);
+ if (!xTextViewCursorSupplier.is())
+ return;
+
+ uno::Reference<text::XPageCursor> xCursor(xTextViewCursorSupplier->getViewCursor(),
+ uno::UNO_QUERY);
+ if (!xCursor.is())
+ return;
+
+ xCursor->jumpToLastPage();
+ sal_Int16 nPages = xCursor->getPage();
+ for (sal_Int16 nPage = 1; nPage <= nPages; ++nPage)
+ {
+ Size aDocumentSizePixel = aRenderer.getDocumentSizeInPixels(nPage);
+ Size aLogic = aRenderer.getDocumentSizeIn100mm(nPage);
+ // Get the CSS pixel size of the page (mm100 -> pixel using 96 DPI, independent from system DPI).
+ Size aCss(static_cast<double>(aLogic.getWidth()) / 26.4583,
+ static_cast<double>(aLogic.getHeight()) / 26.4583);
+ Graphic aGraphic = aRenderer.renderToGraphic(nPage, aDocumentSizePixel, aCss, COL_WHITE,
+ /*bExtOutDevData=*/true);
+ auto& rGDIMetaFile = const_cast<GDIMetaFile&>(aGraphic.GetGDIMetaFile());
+
+ // Set preferred map unit and size on the metafile, so the SVG size
+ // will be correct in MM.
+ MapMode aMapMode;
+ aMapMode.SetMapUnit(MapUnit::Map100thMM);
+ rGDIMetaFile.SetPrefMapMode(aMapMode);
+ rGDIMetaFile.SetPrefSize(aLogic);
+
+ SvMemoryStream aMemoryStream;
+ rGDIMetaFile.Write(aMemoryStream);
+ uno::Sequence<sal_Int8> aSequence(static_cast<const sal_Int8*>(aMemoryStream.GetData()),
+ aMemoryStream.Tell());
+
+ exp::FixedLayoutPage aPage;
+ aPage.aMetafile = aSequence;
+ aPage.aCssPixels = aCss;
+ aPage.aChapterNames = aRenderer.getChapterNames();
+ rPageMetafiles.push_back(aPage);
+ }
+}
+
+void EPUBExportFilter::cancel() {}
+
+void EPUBExportFilter::setSourceDocument(const uno::Reference<lang::XComponent>& xDocument)
+{
+ mxSourceDocument = xDocument;
+}
+
+OUString EPUBExportFilter::getImplementationName()
+{
+ return "com.sun.star.comp.Writer.EPUBExportFilter";
+}
+
+sal_Bool EPUBExportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+uno::Sequence<OUString> EPUBExportFilter::getSupportedServiceNames()
+{
+ uno::Sequence<OUString> aRet = { OUString("com.sun.star.document.ExportFilter") };
+ return aRet;
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT uno::XInterface*
+com_sun_star_comp_Writer_EPUBExportFilter_get_implementation(
+ uno::XComponentContext* pContext, uno::Sequence<uno::Any> const& /*rSeq*/)
+{
+ return cppu::acquire(new EPUBExportFilter(pContext));
+}
+
+} // namespace writerperfect
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/EPUBExportFilter.hxx b/writerperfect/source/writer/EPUBExportFilter.hxx
new file mode 100644
index 000000000..1b9f83030
--- /dev/null
+++ b/writerperfect/source/writer/EPUBExportFilter.hxx
@@ -0,0 +1,83 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_EPUBEXPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_EPUBEXPORTFILTER_HXX
+
+#include <vector>
+
+#include <cppuhelper/implbase.hxx>
+
+#include <com/sun/star/document/XFilter.hpp>
+#include <com/sun/star/document/XExporter.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+
+namespace com
+{
+namespace sun
+{
+namespace star
+{
+namespace uno
+{
+class XComponentContext;
+}
+}
+}
+}
+
+namespace writerperfect
+{
+namespace exp
+{
+struct FixedLayoutPage;
+}
+
+/// EPUB export XFilter implementation.
+class EPUBExportFilter
+ : public cppu::WeakImplHelper<css::document::XFilter, css::document::XExporter,
+ css::lang::XServiceInfo>
+{
+ css::uno::Reference<css::uno::XComponentContext> mxContext;
+ css::uno::Reference<css::lang::XComponent> mxSourceDocument;
+
+public:
+ EPUBExportFilter(css::uno::Reference<css::uno::XComponentContext> xContext);
+
+ // XFilter
+ sal_Bool SAL_CALL
+ filter(const css::uno::Sequence<css::beans::PropertyValue>& rDescriptor) override;
+ void SAL_CALL cancel() override;
+
+ // XExporter
+ void SAL_CALL
+ setSourceDocument(const css::uno::Reference<css::lang::XComponent>& xDocument) override;
+
+ // XServiceInfo
+ OUString SAL_CALL getImplementationName() override;
+ sal_Bool SAL_CALL supportsService(const OUString& rServiceName) override;
+ css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+ /// Gives the default EPUB version.
+ static sal_Int32 GetDefaultVersion();
+ /// Gives the default split method.
+ static sal_Int32 GetDefaultSplitMethod();
+ /// Gives the default layout method.
+ static sal_Int32 GetDefaultLayoutMethod();
+
+private:
+ /// Create page metafiles in case of fixed layout.
+ void CreateMetafiles(std::vector<exp::FixedLayoutPage>& rPageMetafiles);
+};
+
+} // namespace writerperfect
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/EPUBExportUIComponent.cxx b/writerperfect/source/writer/EPUBExportUIComponent.cxx
new file mode 100644
index 000000000..e8d618b99
--- /dev/null
+++ b/writerperfect/source/writer/EPUBExportUIComponent.cxx
@@ -0,0 +1,102 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "EPUBExportUIComponent.hxx"
+
+#include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
+#include <comphelper/namedvaluecollection.hxx>
+#include <cppuhelper/supportsservice.hxx>
+#include <vcl/svapp.hxx>
+
+#include "EPUBExportDialog.hxx"
+
+using namespace com::sun::star;
+
+namespace writerperfect
+{
+EPUBExportUIComponent::EPUBExportUIComponent(uno::Reference<uno::XComponentContext> xContext)
+ : mxContext(std::move(xContext))
+{
+}
+
+uno::Sequence<beans::PropertyValue> EPUBExportUIComponent::getPropertyValues()
+{
+ maMediaDescriptor["FilterData"] <<= maFilterData.getAsConstPropertyValueList();
+ return maMediaDescriptor.getAsConstPropertyValueList();
+}
+
+void EPUBExportUIComponent::setPropertyValues(
+ const uno::Sequence<beans::PropertyValue>& rProperties)
+{
+ maMediaDescriptor.clear();
+ maMediaDescriptor << rProperties;
+ auto it = maMediaDescriptor.find("FilterData");
+ if (it != maMediaDescriptor.end())
+ {
+ uno::Sequence<beans::PropertyValue> aFilterData;
+ if (it->second >>= aFilterData)
+ {
+ maFilterData.clear();
+ maFilterData << aFilterData;
+ }
+ }
+}
+
+OUString EPUBExportUIComponent::getImplementationName()
+{
+ return "com.sun.star.comp.Writer.EPUBExportUIComponent";
+}
+
+sal_Bool EPUBExportUIComponent::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+uno::Sequence<OUString> EPUBExportUIComponent::getSupportedServiceNames()
+{
+ uno::Sequence<OUString> aRet = { OUString("com.sun.star.ui.dialogs.FilterOptionsDialog") };
+ return aRet;
+}
+
+void EPUBExportUIComponent::setTitle(const OUString& /*rTitle*/) {}
+
+void SAL_CALL EPUBExportUIComponent::initialize(const uno::Sequence<uno::Any>& rArguments)
+{
+ ::comphelper::NamedValueCollection aProperties(rArguments);
+ if (aProperties.has("ParentWindow"))
+ aProperties.get("ParentWindow") >>= mxDialogParent;
+}
+
+sal_Int16 EPUBExportUIComponent::execute()
+{
+ SolarMutexGuard aGuard;
+
+ EPUBExportDialog aDialog(Application::GetFrameWeld(mxDialogParent), maFilterData, mxContext,
+ mxSourceDocument);
+ if (aDialog.run() == RET_OK)
+ return ui::dialogs::ExecutableDialogResults::OK;
+ return ui::dialogs::ExecutableDialogResults::CANCEL;
+}
+
+void SAL_CALL EPUBExportUIComponent::setSourceDocument(
+ const css::uno::Reference<css::lang::XComponent>& xDocument)
+{
+ mxSourceDocument = xDocument;
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT uno::XInterface*
+com_sun_star_comp_Writer_EPUBExportUIComponent_get_implementation(
+ uno::XComponentContext* pCtx, uno::Sequence<uno::Any> const& /*rSeq*/)
+{
+ return cppu::acquire(new EPUBExportUIComponent(pCtx));
+}
+
+} // namespace writerperfect
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/EPUBExportUIComponent.hxx b/writerperfect/source/writer/EPUBExportUIComponent.hxx
new file mode 100644
index 000000000..8b5852fcc
--- /dev/null
+++ b/writerperfect/source/writer/EPUBExportUIComponent.hxx
@@ -0,0 +1,84 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_EPUBEXPORTUICOMPONENT_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_EPUBEXPORTUICOMPONENT_HXX
+
+#include <com/sun/star/beans/XPropertyAccess.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
+#include <com/sun/star/document/XExporter.hpp>
+#include <com/sun/star/awt/XWindow.hpp>
+
+#include <comphelper/sequenceashashmap.hxx>
+#include <cppuhelper/implbase.hxx>
+
+namespace com
+{
+namespace sun
+{
+namespace star
+{
+namespace uno
+{
+class XComponentContext;
+}
+}
+}
+}
+
+namespace writerperfect
+{
+/// EPUB export UI component implementation.
+class EPUBExportUIComponent
+ : public cppu::WeakImplHelper<css::beans::XPropertyAccess, css::lang::XInitialization,
+ css::lang::XServiceInfo, css::ui::dialogs::XExecutableDialog,
+ css::document::XExporter>
+{
+public:
+ EPUBExportUIComponent(css::uno::Reference<css::uno::XComponentContext> xContext);
+
+ // XPropertyAccess
+ css::uno::Sequence<css::beans::PropertyValue> SAL_CALL getPropertyValues() override;
+ void SAL_CALL
+ setPropertyValues(const css::uno::Sequence<css::beans::PropertyValue>& rProperties) override;
+
+ // XServiceInfo
+ OUString SAL_CALL getImplementationName() override;
+ sal_Bool SAL_CALL supportsService(const OUString& rServiceName) override;
+ css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+ // XExecutableDialog
+ void SAL_CALL setTitle(const OUString& rTitle) override;
+ sal_Int16 SAL_CALL execute() override;
+
+ // XExporter
+ void SAL_CALL
+ setSourceDocument(const css::uno::Reference<css::lang::XComponent>& xDocument) override;
+
+ // XInitialization
+ void SAL_CALL initialize(const css::uno::Sequence<css::uno::Any>& rArguments) override;
+
+private:
+ /// The full set of property values.
+ comphelper::SequenceAsHashMap maMediaDescriptor;
+ /// The filter data key.
+ comphelper::SequenceAsHashMap maFilterData;
+ /// UNO context.
+ css::uno::Reference<css::uno::XComponentContext> mxContext;
+ css::uno::Reference<css::lang::XComponent> mxSourceDocument;
+ css::uno::Reference<css::awt::XWindow> mxDialogParent;
+};
+
+} // namespace writerperfect
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/EPUBPackage.cxx b/writerperfect/source/writer/EPUBPackage.cxx
new file mode 100644
index 000000000..914983e97
--- /dev/null
+++ b/writerperfect/source/writer/EPUBPackage.cxx
@@ -0,0 +1,216 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "EPUBPackage.hxx"
+
+#include <com/sun/star/embed/ElementModes.hpp>
+#include <com/sun/star/embed/XStorage.hpp>
+#include <com/sun/star/embed/XTransactedObject.hpp>
+#include <com/sun/star/io/XSeekable.hpp>
+#include <com/sun/star/xml/sax/Writer.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/embed/XHierarchicalStorageAccess.hpp>
+
+#include <sal/log.hxx>
+#include <comphelper/storagehelper.hxx>
+#include <unotools/mediadescriptor.hxx>
+#include <xmloff/attrlist.hxx>
+
+using namespace com::sun::star;
+
+namespace writerperfect
+{
+EPUBPackage::EPUBPackage(uno::Reference<uno::XComponentContext> xContext,
+ const uno::Sequence<beans::PropertyValue>& rDescriptor)
+ : mxContext(std::move(xContext))
+{
+ // Extract the output stream from the descriptor.
+ utl::MediaDescriptor aMediaDesc(rDescriptor);
+ auto xStream = aMediaDesc.getUnpackedValueOrDefault(
+ utl::MediaDescriptor::PROP_STREAMFOROUTPUT(), uno::Reference<io::XStream>());
+ const sal_Int32 nOpenMode = embed::ElementModes::READWRITE | embed::ElementModes::TRUNCATE;
+ mxStorage.set(comphelper::OStorageHelper::GetStorageOfFormatFromStream(
+ ZIP_STORAGE_FORMAT_STRING, xStream, nOpenMode, mxContext),
+ uno::UNO_QUERY);
+
+ // The zipped content represents an EPUB Publication.
+ mxOutputStream.set(
+ mxStorage->openStreamElementByHierarchicalName("mimetype", embed::ElementModes::READWRITE),
+ uno::UNO_QUERY);
+ const OString aMimeType("application/epub+zip");
+ uno::Sequence<sal_Int8> aData(reinterpret_cast<const sal_Int8*>(aMimeType.getStr()),
+ aMimeType.getLength());
+ mxOutputStream->writeBytes(aData);
+ uno::Reference<embed::XTransactedObject> xTransactedObject(mxOutputStream, uno::UNO_QUERY);
+ xTransactedObject->commit();
+
+ // MIME type must be uncompressed.
+ uno::Reference<beans::XPropertySet> xPropertySet(mxOutputStream, uno::UNO_QUERY);
+ xPropertySet->setPropertyValue("Compressed", uno::makeAny(false));
+ mxOutputStream.clear();
+}
+
+EPUBPackage::~EPUBPackage()
+{
+ uno::Reference<embed::XTransactedObject> xTransactedObject(mxStorage, uno::UNO_QUERY);
+ xTransactedObject->commit();
+}
+
+void EPUBPackage::openXMLFile(const char* pName)
+{
+ assert(pName);
+ assert(!mxOutputStream.is());
+ assert(!mxOutputWriter.is());
+
+ mxOutputStream.set(mxStorage->openStreamElementByHierarchicalName(
+ OUString::fromUtf8(pName), embed::ElementModes::READWRITE),
+ uno::UNO_QUERY);
+ mxOutputWriter = xml::sax::Writer::create(mxContext);
+ mxOutputWriter->setOutputStream(mxOutputStream);
+ mxOutputWriter->startDocument();
+}
+
+void EPUBPackage::openElement(const char* pName, const librevenge::RVNGPropertyList& rAttributes)
+{
+ assert(mxOutputWriter.is());
+
+ rtl::Reference<SvXMLAttributeList> pAttributeList(new SvXMLAttributeList());
+
+ librevenge::RVNGPropertyList::Iter it(rAttributes);
+ for (it.rewind(); it.next();)
+ pAttributeList->AddAttribute(OUString::fromUtf8(it.key()),
+ OUString::fromUtf8(it()->getStr().cstr()));
+
+ mxOutputWriter->startElement(OUString::fromUtf8(pName),
+ uno::Reference<xml::sax::XAttributeList>(pAttributeList.get()));
+}
+
+void EPUBPackage::closeElement(const char* pName)
+{
+ assert(mxOutputWriter.is());
+
+ mxOutputWriter->endElement(OUString::fromUtf8(pName));
+}
+
+void EPUBPackage::insertCharacters(const librevenge::RVNGString& rCharacters)
+{
+ mxOutputWriter->characters(OUString::fromUtf8(rCharacters.cstr()));
+}
+
+void EPUBPackage::closeXMLFile()
+{
+ assert(mxOutputWriter.is());
+ assert(mxOutputStream.is());
+
+ mxOutputWriter->endDocument();
+ mxOutputWriter.clear();
+
+ uno::Reference<embed::XTransactedObject> xTransactedObject(mxOutputStream, uno::UNO_QUERY);
+ xTransactedObject->commit();
+ mxOutputStream.clear();
+}
+
+void EPUBPackage::openCSSFile(const char* pName)
+{
+ assert(pName);
+ assert(!mxOutputStream.is());
+
+ mxOutputStream.set(mxStorage->openStreamElementByHierarchicalName(
+ OUString::fromUtf8(pName), embed::ElementModes::READWRITE),
+ uno::UNO_QUERY);
+}
+
+void EPUBPackage::insertRule(const librevenge::RVNGString& rSelector,
+ const librevenge::RVNGPropertyList& rProperties)
+{
+ assert(mxOutputStream.is());
+
+ uno::Reference<io::XSeekable> xSeekable(mxOutputStream, uno::UNO_QUERY);
+ std::stringstream aStream;
+ if (xSeekable->getPosition() != 0)
+ aStream << '\n';
+ aStream << rSelector.cstr() << " {\n";
+
+ librevenge::RVNGPropertyList::Iter it(rProperties);
+ for (it.rewind(); it.next();)
+ {
+ if (it())
+ aStream << " " << it.key() << ": " << it()->getStr().cstr() << ";\n";
+ }
+
+ aStream << "}\n";
+ std::string aString = aStream.str();
+ uno::Sequence<sal_Int8> aData(reinterpret_cast<const sal_Int8*>(aString.c_str()),
+ aString.size());
+ mxOutputStream->writeBytes(aData);
+}
+
+void EPUBPackage::closeCSSFile()
+{
+ assert(mxOutputStream.is());
+
+ uno::Reference<embed::XTransactedObject> xTransactedObject(mxOutputStream, uno::UNO_QUERY);
+ xTransactedObject->commit();
+ mxOutputStream.clear();
+}
+
+void EPUBPackage::openBinaryFile(const char* pName)
+{
+ assert(pName);
+ assert(!mxOutputStream.is());
+
+ mxOutputStream.set(mxStorage->openStreamElementByHierarchicalName(
+ OUString::fromUtf8(pName), embed::ElementModes::READWRITE),
+ uno::UNO_QUERY);
+}
+
+void EPUBPackage::insertBinaryData(const librevenge::RVNGBinaryData& rData)
+{
+ assert(mxOutputStream.is());
+
+ if (rData.empty())
+ return;
+
+ uno::Sequence<sal_Int8> aData(reinterpret_cast<const sal_Int8*>(rData.getDataBuffer()),
+ rData.size());
+ mxOutputStream->writeBytes(aData);
+}
+
+void EPUBPackage::closeBinaryFile()
+{
+ assert(mxOutputStream.is());
+
+ uno::Reference<embed::XTransactedObject> xTransactedObject(mxOutputStream, uno::UNO_QUERY);
+ xTransactedObject->commit();
+ mxOutputStream.clear();
+}
+
+void EPUBPackage::openTextFile(const char* pName)
+{
+ SAL_WARN("writerperfect", "EPUBPackage::openTextFile, " << pName << ": implement me");
+}
+
+void EPUBPackage::insertText(const librevenge::RVNGString& /*rCharacters*/)
+{
+ SAL_WARN("writerperfect", "EPUBPackage::insertText: implement me");
+}
+
+void EPUBPackage::insertLineBreak()
+{
+ SAL_WARN("writerperfect", "EPUBPackage::insertLineBreak: implement me");
+}
+
+void EPUBPackage::closeTextFile()
+{
+ SAL_WARN("writerperfect", "EPUBPackage::closeTextFile: implement me");
+}
+
+} // namespace writerperfect
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/EPUBPackage.hxx b/writerperfect/source/writer/EPUBPackage.hxx
new file mode 100644
index 000000000..00cd129d8
--- /dev/null
+++ b/writerperfect/source/writer/EPUBPackage.hxx
@@ -0,0 +1,102 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_EPUBPACKAGE_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_EPUBPACKAGE_HXX
+
+#include <libepubgen/EPUBPackage.h>
+
+#include <com/sun/star/uno/Sequence.h>
+#include <com/sun/star/uno/Reference.h>
+
+namespace com
+{
+namespace sun
+{
+namespace star
+{
+namespace beans
+{
+struct PropertyValue;
+}
+namespace embed
+{
+class XHierarchicalStorageAccess;
+}
+namespace io
+{
+class XOutputStream;
+}
+namespace uno
+{
+class XComponentContext;
+}
+namespace xml
+{
+namespace sax
+{
+class XWriter;
+}
+}
+}
+}
+}
+
+namespace writerperfect
+{
+/// The epub package has direct access to the resulting ZIP file.
+class EPUBPackage : public libepubgen::EPUBPackage
+{
+ css::uno::Reference<css::uno::XComponentContext> mxContext;
+ css::uno::Reference<css::embed::XHierarchicalStorageAccess> mxStorage;
+ css::uno::Reference<css::io::XOutputStream> mxOutputStream;
+ css::uno::Reference<css::xml::sax::XWriter> mxOutputWriter;
+
+public:
+ explicit EPUBPackage(css::uno::Reference<css::uno::XComponentContext> xContext,
+ const css::uno::Sequence<css::beans::PropertyValue>& rDescriptor);
+
+ ~EPUBPackage() override;
+
+ void openXMLFile(const char* pName) override;
+
+ void openElement(const char* pName, const librevenge::RVNGPropertyList& rAttributes) override;
+ void closeElement(const char* pName) override;
+
+ void insertCharacters(const librevenge::RVNGString& rCharacters) override;
+
+ void closeXMLFile() override;
+
+ void openCSSFile(const char* pName) override;
+
+ void insertRule(const librevenge::RVNGString& rSelector,
+ const librevenge::RVNGPropertyList& rProperties) override;
+
+ void closeCSSFile() override;
+
+ void openBinaryFile(const char* pName) override;
+
+ void insertBinaryData(const librevenge::RVNGBinaryData& rData) override;
+
+ void closeBinaryFile() override;
+
+ void openTextFile(const char* pName) override;
+
+ void insertText(const librevenge::RVNGString& rCharacters) override;
+
+ void insertLineBreak() override;
+
+ void closeTextFile() override;
+};
+
+} // namespace writerperfect
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/MSWorksImportFilter.cxx b/writerperfect/source/writer/MSWorksImportFilter.cxx
new file mode 100644
index 000000000..5339d9e3f
--- /dev/null
+++ b/writerperfect/source/writer/MSWorksImportFilter.cxx
@@ -0,0 +1,154 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* MSWorksImportFilter: Sets up the filter, and calls DocumentCollector
+ * to do the actual filtering
+ *
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <cppuhelper/supportsservice.hxx>
+#include <tools/diagnose_ex.h>
+
+#include <libwps/libwps.h>
+
+#include <WPFTEncodingDialog.hxx>
+#include <WPFTResMgr.hxx>
+#include "MSWorksImportFilter.hxx"
+#include <strings.hrc>
+
+static bool handleEmbeddedWKSObject(const librevenge::RVNGBinaryData& data,
+ OdfDocumentHandler* pHandler, const OdfStreamType streamType)
+{
+ OdsGenerator exporter;
+ exporter.addDocumentHandler(pHandler, streamType);
+ return libwps::WPSDocument::parse(data.getDataStream(), &exporter) == libwps::WPS_OK;
+}
+
+bool MSWorksImportFilter::doImportDocument(weld::Window* pParent,
+ librevenge::RVNGInputStream& rInput,
+ OdtGenerator& rGenerator,
+ utl::MediaDescriptor& mediaDescriptor)
+{
+ libwps::WPSKind kind = libwps::WPS_TEXT;
+ libwps::WPSCreator creator;
+ bool needEncoding = false;
+ const libwps::WPSConfidence confidence
+ = libwps::WPSDocument::isFileFormatSupported(&rInput, kind, creator, needEncoding);
+
+ std::string fileEncoding;
+ if ((kind == libwps::WPS_TEXT) && (confidence == libwps::WPS_CONFIDENCE_EXCELLENT)
+ && needEncoding)
+ {
+ OUString encoding;
+ // first check if we can find the encoding in the filter options (headless mode)
+ mediaDescriptor[utl::MediaDescriptor::PROP_FILTEROPTIONS()] >>= encoding;
+ if (!encoding.isEmpty()) // TODO: check if the encoding string is valid
+ fileEncoding = encoding.toUtf8().getStr();
+ else
+ {
+ OUString title;
+
+ switch (creator)
+ {
+ case libwps::WPS_MSWORKS:
+ title = WpResId(STR_ENCODING_DIALOG_TITLE_MSWORKS);
+ encoding = "CP850";
+ break;
+ case libwps::WPS_RESERVED_0: // MS Write
+ title = WpResId(STR_ENCODING_DIALOG_TITLE_MSWRITE);
+ encoding = "CP1252";
+ break;
+ case libwps::WPS_RESERVED_1: // DosWord
+ title = WpResId(STR_ENCODING_DIALOG_TITLE_DOSWORD);
+ encoding = "CP850";
+ break;
+ default:
+ title = WpResId(STR_ENCODING_DIALOG_TITLE);
+ encoding = "CP850";
+ break;
+ }
+
+ fileEncoding = encoding.toUtf8().getStr(); // set default to the proposed encoding
+ try
+ {
+ writerperfect::WPFTEncodingDialog aDlg(pParent, title, encoding);
+ if (aDlg.run() == RET_OK)
+ {
+ if (!aDlg.GetEncoding().isEmpty())
+ fileEncoding = aDlg.GetEncoding().toUtf8().getStr();
+ }
+ // we can fail because we are in headless mode, the user has cancelled conversion, ...
+ else if (aDlg.hasUserCalledCancel())
+ return false;
+ }
+ catch (css::uno::Exception&)
+ {
+ TOOLS_WARN_EXCEPTION("writerperfect", "ignoring");
+ }
+ }
+ }
+ return libwps::WPS_OK
+ == libwps::WPSDocument::parse(&rInput, &rGenerator, "", fileEncoding.c_str());
+}
+
+bool MSWorksImportFilter::doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName)
+{
+ libwps::WPSKind kind = libwps::WPS_TEXT;
+ libwps::WPSCreator creator;
+ bool needEncoding;
+ const libwps::WPSConfidence confidence
+ = libwps::WPSDocument::isFileFormatSupported(&rInput, kind, creator, needEncoding);
+
+ if ((kind == libwps::WPS_TEXT) && (confidence == libwps::WPS_CONFIDENCE_EXCELLENT))
+ {
+ switch (creator)
+ {
+ case libwps::WPS_MSWORKS:
+ rTypeName = "writer_MS_Works_Document";
+ break;
+ case libwps::WPS_RESERVED_0:
+ rTypeName = "writer_MS_Write";
+ break;
+ case libwps::WPS_RESERVED_1:
+ rTypeName = "writer_DosWord";
+ break;
+ default:
+ break;
+ }
+ }
+
+ return !rTypeName.isEmpty();
+}
+
+void MSWorksImportFilter::doRegisterHandlers(OdtGenerator& rGenerator)
+{
+ rGenerator.registerEmbeddedObjectHandler("image/wks-ods", &handleEmbeddedWKSObject);
+}
+
+// XServiceInfo
+OUString SAL_CALL MSWorksImportFilter::getImplementationName()
+{
+ return "com.sun.star.comp.Writer.MSWorksImportFilter";
+}
+
+sal_Bool SAL_CALL MSWorksImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+css::uno::Sequence<OUString> SAL_CALL MSWorksImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Writer_MSWorksImportFilter_get_implementation(
+ css::uno::XComponentContext* const context, const css::uno::Sequence<css::uno::Any>&)
+{
+ return cppu::acquire(new MSWorksImportFilter(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/MSWorksImportFilter.hxx b/writerperfect/source/writer/MSWorksImportFilter.hxx
new file mode 100644
index 000000000..33635cc37
--- /dev/null
+++ b/writerperfect/source/writer/MSWorksImportFilter.hxx
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_MSWORKSIMPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_MSWORKSIMPORTFILTER_HXX
+
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+#include <ImportFilter.hxx>
+
+#include <DocumentHandlerForOdt.hxx>
+
+/* This component will be instantiated for both import or export. Whether it calls
+ * setSourceDocument or setTargetDocument determines which Impl function the filter
+ * member calls */
+class MSWorksImportFilter : public writerperfect::ImportFilter<OdtGenerator>
+{
+public:
+ explicit MSWorksImportFilter(const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdtGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
+ OdtGenerator& rGenerator, utl::MediaDescriptor&) override;
+ virtual void doRegisterHandlers(OdtGenerator& rGenerator) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/MWAWImportFilter.cxx b/writerperfect/source/writer/MWAWImportFilter.cxx
new file mode 100644
index 000000000..33fe2d95f
--- /dev/null
+++ b/writerperfect/source/writer/MWAWImportFilter.cxx
@@ -0,0 +1,117 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* MWAWImportFilter: Sets up the filter, and calls DocumentCollector
+ * to do the actual filtering
+ *
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <cppuhelper/supportsservice.hxx>
+
+#include <libmwaw/libmwaw.hxx>
+
+#include "MWAWImportFilter.hxx"
+
+static bool handleEmbeddedMWAWGraphicObject(const librevenge::RVNGBinaryData& data,
+ OdfDocumentHandler* pHandler,
+ const OdfStreamType streamType)
+{
+ OdgGenerator exporter;
+ exporter.addDocumentHandler(pHandler, streamType);
+ return MWAWDocument::decodeGraphic(data, &exporter);
+}
+
+static bool handleEmbeddedMWAWSpreadsheetObject(const librevenge::RVNGBinaryData& data,
+ OdfDocumentHandler* pHandler,
+ const OdfStreamType streamType)
+{
+ OdsGenerator exporter;
+ exporter.registerEmbeddedObjectHandler("image/mwaw-odg", &handleEmbeddedMWAWGraphicObject);
+ exporter.addDocumentHandler(pHandler, streamType);
+ return MWAWDocument::decodeSpreadsheet(data, &exporter);
+}
+
+bool MWAWImportFilter::doImportDocument(weld::Window*, librevenge::RVNGInputStream& rInput,
+ OdtGenerator& rGenerator, utl::MediaDescriptor&)
+{
+ return MWAWDocument::MWAW_R_OK == MWAWDocument::parse(&rInput, &rGenerator);
+}
+
+bool MWAWImportFilter::doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName)
+{
+ rTypeName.clear();
+
+ MWAWDocument::Type docType = MWAWDocument::MWAW_T_UNKNOWN;
+ MWAWDocument::Kind docKind = MWAWDocument::MWAW_K_UNKNOWN;
+ const MWAWDocument::Confidence confidence
+ = MWAWDocument::isFileFormatSupported(&rInput, docType, docKind);
+
+ if (confidence == MWAWDocument::MWAW_C_EXCELLENT)
+ {
+ if (docKind == MWAWDocument::MWAW_K_TEXT)
+ {
+ switch (docType)
+ {
+ case MWAWDocument::MWAW_T_CLARISWORKS:
+ rTypeName = "writer_ClarisWorks";
+ break;
+ case MWAWDocument::MWAW_T_MACWRITE:
+ case MWAWDocument::MWAW_T_MACWRITEPRO:
+ rTypeName = "writer_MacWrite";
+ break;
+ case MWAWDocument::MWAW_T_MARINERWRITE:
+ rTypeName = "writer_Mariner_Write";
+ break;
+ case MWAWDocument::MWAW_T_MICROSOFTWORD:
+ rTypeName = "writer_Mac_Word";
+ break;
+ case MWAWDocument::MWAW_T_MICROSOFTWORKS:
+ rTypeName = "writer_Mac_Works";
+ break;
+ case MWAWDocument::MWAW_T_WRITENOW:
+ rTypeName = "writer_WriteNow";
+ break;
+ default:
+ rTypeName = "MWAW_Text_Document";
+ break;
+ }
+ }
+ }
+
+ return !rTypeName.isEmpty();
+}
+
+void MWAWImportFilter::doRegisterHandlers(OdtGenerator& rGenerator)
+{
+ rGenerator.registerEmbeddedObjectHandler("image/mwaw-odg", &handleEmbeddedMWAWGraphicObject);
+ rGenerator.registerEmbeddedObjectHandler("image/mwaw-ods",
+ &handleEmbeddedMWAWSpreadsheetObject);
+}
+
+// XServiceInfo
+OUString SAL_CALL MWAWImportFilter::getImplementationName()
+{
+ return "com.sun.star.comp.Writer.MWAWImportFilter";
+}
+
+sal_Bool SAL_CALL MWAWImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+css::uno::Sequence<OUString> SAL_CALL MWAWImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Writer_MWAWImportFilter_get_implementation(
+ css::uno::XComponentContext* const context, const css::uno::Sequence<css::uno::Any>&)
+{
+ return cppu::acquire(new MWAWImportFilter(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/MWAWImportFilter.hxx b/writerperfect/source/writer/MWAWImportFilter.hxx
new file mode 100644
index 000000000..5d67aa31d
--- /dev/null
+++ b/writerperfect/source/writer/MWAWImportFilter.hxx
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_MWAWIMPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_MWAWIMPORTFILTER_HXX
+
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+#include <ImportFilter.hxx>
+
+#include <DocumentHandlerForOdt.hxx>
+
+/* This component will be instantiated for both import or export. Whether it calls
+ * setSourceDocument or setTargetDocument determines which Impl function the filter
+ * member calls */
+class MWAWImportFilter : public writerperfect::ImportFilter<OdtGenerator>
+{
+public:
+ explicit MWAWImportFilter(const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdtGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
+ OdtGenerator& rGenerator, utl::MediaDescriptor&) override;
+ virtual void doRegisterHandlers(OdtGenerator& rGenerator) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/PagesImportFilter.cxx b/writerperfect/source/writer/PagesImportFilter.cxx
new file mode 100644
index 000000000..9d8bb5eb3
--- /dev/null
+++ b/writerperfect/source/writer/PagesImportFilter.cxx
@@ -0,0 +1,63 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* PagesImportFilter: Sets up the filter, and calls DocumentCollector
+ * to do the actual filtering
+ *
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <libetonyek/libetonyek.h>
+
+#include <cppuhelper/supportsservice.hxx>
+
+#include "PagesImportFilter.hxx"
+
+using libetonyek::EtonyekDocument;
+
+bool PagesImportFilter::doImportDocument(weld::Window*, librevenge::RVNGInputStream& rInput,
+ OdtGenerator& rGenerator, utl::MediaDescriptor&)
+{
+ return EtonyekDocument::parse(&rInput, &rGenerator);
+}
+
+bool PagesImportFilter::doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName)
+{
+ EtonyekDocument::Type type = EtonyekDocument::TYPE_UNKNOWN;
+ const EtonyekDocument::Confidence confidence = EtonyekDocument::isSupported(&rInput, &type);
+ if ((confidence == EtonyekDocument::CONFIDENCE_EXCELLENT)
+ && (type == EtonyekDocument::TYPE_PAGES))
+ {
+ rTypeName = "writer_ApplePages";
+ return true;
+ }
+
+ return false;
+}
+
+// XServiceInfo
+OUString SAL_CALL PagesImportFilter::getImplementationName()
+{
+ return "org.libreoffice.comp.Writer.PagesImportFilter";
+}
+
+sal_Bool SAL_CALL PagesImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+css::uno::Sequence<OUString> SAL_CALL PagesImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+org_libreoffice_comp_Writer_PagesImportFilter_get_implementation(
+ css::uno::XComponentContext* const context, const css::uno::Sequence<css::uno::Any>&)
+{
+ return cppu::acquire(new PagesImportFilter(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/PagesImportFilter.hxx b/writerperfect/source/writer/PagesImportFilter.hxx
new file mode 100644
index 000000000..5e9f5c50c
--- /dev/null
+++ b/writerperfect/source/writer/PagesImportFilter.hxx
@@ -0,0 +1,43 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_PAGESIMPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_PAGESIMPORTFILTER_HXX
+
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+#include <DocumentHandlerForOdt.hxx>
+#include <ImportFilter.hxx>
+
+/* This component will be instantiated for both import or export. Whether it calls
+ * setSourceDocument or setTargetDocument determines which Impl function the filter
+ * member calls */
+class PagesImportFilter : public writerperfect::ImportFilter<OdtGenerator>
+{
+public:
+ explicit PagesImportFilter(const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdtGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
+ OdtGenerator& rGenerator,
+ utl::MediaDescriptor& rDescriptor) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/StarOfficeWriterImportFilter.cxx b/writerperfect/source/writer/StarOfficeWriterImportFilter.cxx
new file mode 100644
index 000000000..849ede0d7
--- /dev/null
+++ b/writerperfect/source/writer/StarOfficeWriterImportFilter.cxx
@@ -0,0 +1,128 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <cppuhelper/supportsservice.hxx>
+
+#include <libstaroffice/libstaroffice.hxx>
+
+#include <sfx2/passwd.hxx>
+
+#include "StarOfficeWriterImportFilter.hxx"
+
+using com::sun::star::uno::Sequence;
+using com::sun::star::uno::XComponentContext;
+using com::sun::star::uno::XInterface;
+
+static bool handleEmbeddedSTOFFWriterGraphicObject(const librevenge::RVNGBinaryData& data,
+ OdfDocumentHandler* pHandler,
+ const OdfStreamType streamType)
+{
+ OdgGenerator exporter;
+ exporter.addDocumentHandler(pHandler, streamType);
+ return STOFFDocument::decodeGraphic(data, &exporter);
+}
+
+static bool handleEmbeddedSTOFFWriterSpreadsheetObject(const librevenge::RVNGBinaryData& data,
+ OdfDocumentHandler* pHandler,
+ const OdfStreamType streamType)
+{
+ OdsGenerator exporter;
+ exporter.registerEmbeddedObjectHandler("image/stoff-odg",
+ &handleEmbeddedSTOFFWriterGraphicObject);
+ exporter.addDocumentHandler(pHandler, streamType);
+ return STOFFDocument::decodeSpreadsheet(data, &exporter);
+}
+
+bool StarOfficeWriterImportFilter::doImportDocument(weld::Window* pParent,
+ librevenge::RVNGInputStream& rInput,
+ OdtGenerator& rGenerator, utl::MediaDescriptor&)
+{
+ STOFFDocument::Kind docKind = STOFFDocument::STOFF_K_UNKNOWN;
+ const STOFFDocument::Confidence confidence
+ = STOFFDocument::isFileFormatSupported(&rInput, docKind);
+ OString aUtf8Passwd;
+ if (confidence == STOFFDocument::STOFF_C_SUPPORTED_ENCRYPTION)
+ {
+ // try to ask for a password
+ try
+ {
+ SfxPasswordDialog aPasswdDlg(pParent);
+ aPasswdDlg.SetMinLen(0);
+ if (!aPasswdDlg.run())
+ return false;
+ OUString aPasswd = aPasswdDlg.GetPassword();
+ aUtf8Passwd = OUStringToOString(aPasswd, RTL_TEXTENCODING_UTF8);
+ }
+ catch (...)
+ {
+ // ok, we will probably guess it
+ }
+ }
+ return STOFFDocument::STOFF_R_OK
+ == STOFFDocument::parse(&rInput, &rGenerator,
+ !aUtf8Passwd.isEmpty() ? aUtf8Passwd.getStr() : nullptr);
+}
+
+bool StarOfficeWriterImportFilter::doDetectFormat(librevenge::RVNGInputStream& rInput,
+ OUString& rTypeName)
+{
+ rTypeName.clear();
+
+ STOFFDocument::Kind docKind = STOFFDocument::STOFF_K_UNKNOWN;
+ const STOFFDocument::Confidence confidence
+ = STOFFDocument::isFileFormatSupported(&rInput, docKind);
+
+ if (confidence == STOFFDocument::STOFF_C_EXCELLENT
+ || confidence == STOFFDocument::STOFF_C_SUPPORTED_ENCRYPTION)
+ {
+ switch (docKind)
+ {
+ case STOFFDocument::STOFF_K_TEXT:
+ rTypeName = "StarOffice_Writer";
+ break;
+ default:
+ break;
+ }
+ }
+
+ return !rTypeName.isEmpty();
+}
+
+void StarOfficeWriterImportFilter::doRegisterHandlers(OdtGenerator& rGenerator)
+{
+ rGenerator.registerEmbeddedObjectHandler("image/stoff-odg",
+ &handleEmbeddedSTOFFWriterGraphicObject);
+ rGenerator.registerEmbeddedObjectHandler("image/stoff-ods",
+ &handleEmbeddedSTOFFWriterSpreadsheetObject);
+}
+
+// XServiceInfo
+OUString SAL_CALL StarOfficeWriterImportFilter::getImplementationName()
+{
+ return "org.libreoffice.comp.Writer.StarOfficeWriterImportFilter";
+}
+
+sal_Bool SAL_CALL StarOfficeWriterImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+Sequence<OUString> SAL_CALL StarOfficeWriterImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+org_libreoffice_comp_Writer_StarOfficeWriterImportFilter_get_implementation(
+ css::uno::XComponentContext* const context, const css::uno::Sequence<css::uno::Any>&)
+{
+ return cppu::acquire(new StarOfficeWriterImportFilter(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/StarOfficeWriterImportFilter.hxx b/writerperfect/source/writer/StarOfficeWriterImportFilter.hxx
new file mode 100644
index 000000000..745b94786
--- /dev/null
+++ b/writerperfect/source/writer/StarOfficeWriterImportFilter.hxx
@@ -0,0 +1,45 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_STAROFFICEWRITERIMPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_STAROFFICEWRITERIMPORTFILTER_HXX
+
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+#include <ImportFilter.hxx>
+
+#include <DocumentHandlerForOdt.hxx>
+
+/* This component will be instantiated for both import or export. Whether it calls
+ * setSourceDocument or setTargetDocument determines which Impl function the filter
+ * member calls */
+class StarOfficeWriterImportFilter : public writerperfect::ImportFilter<OdtGenerator>
+{
+public:
+ explicit StarOfficeWriterImportFilter(
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : writerperfect::ImportFilter<OdtGenerator>(rxContext)
+ {
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) override;
+ virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
+ OdtGenerator& rGenerator, utl::MediaDescriptor&) override;
+ virtual void doRegisterHandlers(OdtGenerator& rGenerator) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/WordPerfectImportFilter.cxx b/writerperfect/source/writer/WordPerfectImportFilter.cxx
new file mode 100644
index 000000000..ca27d5fbc
--- /dev/null
+++ b/writerperfect/source/writer/WordPerfectImportFilter.cxx
@@ -0,0 +1,233 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+/* "This product is not manufactured, approved, or supported by
+ * Corel Corporation or Corel Corporation Limited."
+ */
+
+#include <osl/diagnose.h>
+
+#include <com/sun/star/awt/XWindow.hpp>
+#include <com/sun/star/io/XInputStream.hpp>
+#include <com/sun/star/xml/sax/XDocumentHandler.hpp>
+#include <com/sun/star/uno/Reference.h>
+#include <cppuhelper/supportsservice.hxx>
+
+#include <DocumentHandler.hxx>
+#include <WPXSvInputStream.hxx>
+
+#include <sfx2/passwd.hxx>
+#include <ucbhelper/content.hxx>
+#include <vcl/svapp.hxx>
+
+#include <libwpd/libwpd.h>
+#include <libwpg/libwpg.h>
+
+#include "WordPerfectImportFilter.hxx"
+
+using com::sun::star::uno::Reference;
+
+using com::sun::star::awt::XWindow;
+using com::sun::star::document::XImporter;
+using com::sun::star::io::XInputStream;
+using com::sun::star::xml::sax::XDocumentHandler;
+
+using writerperfect::DocumentHandler;
+using writerperfect::WPXSvInputStream;
+
+static bool handleEmbeddedWPGObject(const librevenge::RVNGBinaryData& data,
+ OdfDocumentHandler* pHandler, const OdfStreamType streamType)
+{
+ OdgGenerator exporter;
+ exporter.addDocumentHandler(pHandler, streamType);
+
+ libwpg::WPGFileFormat fileFormat = libwpg::WPG_AUTODETECT;
+
+ if (!libwpg::WPGraphics::isSupported(data.getDataStream()))
+ fileFormat = libwpg::WPG_WPG1;
+
+ return libwpg::WPGraphics::parse(data.getDataStream(), &exporter, fileFormat);
+}
+
+static bool handleEmbeddedWPGImage(const librevenge::RVNGBinaryData& input,
+ librevenge::RVNGBinaryData& output)
+{
+ libwpg::WPGFileFormat fileFormat = libwpg::WPG_AUTODETECT;
+
+ if (!libwpg::WPGraphics::isSupported(input.getDataStream()))
+ fileFormat = libwpg::WPG_WPG1;
+
+ librevenge::RVNGStringVector svgOutput;
+ librevenge::RVNGSVGDrawingGenerator aSVGGenerator(svgOutput, "");
+
+ if (!libwpg::WPGraphics::parse(input.getDataStream(), &aSVGGenerator, fileFormat))
+ return false;
+
+ if (svgOutput.empty())
+ return false;
+
+ assert(1 == svgOutput.size());
+
+ output.clear();
+ output.append(reinterpret_cast<const unsigned char*>(svgOutput[0].cstr()), svgOutput[0].size());
+ return true;
+}
+
+bool WordPerfectImportFilter::importImpl(
+ const css::uno::Sequence<css::beans::PropertyValue>& aDescriptor)
+{
+ Reference<XInputStream> xInputStream;
+ Reference<XWindow> xDialogParent;
+ for (const auto& rValue : aDescriptor)
+ {
+ if (rValue.Name == "InputStream")
+ rValue.Value >>= xInputStream;
+ else if (rValue.Name == "ParentWindow")
+ rValue.Value >>= xDialogParent;
+ }
+ if (!xInputStream.is())
+ {
+ OSL_ASSERT(false);
+ return false;
+ }
+
+ WPXSvInputStream input(xInputStream);
+
+ OString aUtf8Passwd;
+
+ libwpd::WPDConfidence confidence = libwpd::WPDocument::isFileFormatSupported(&input);
+
+ if (libwpd::WPD_CONFIDENCE_SUPPORTED_ENCRYPTION == confidence)
+ {
+ int unsuccessfulAttempts = 0;
+ while (true)
+ {
+ SfxPasswordDialog aPasswdDlg(Application::GetFrameWeld(xDialogParent));
+ aPasswdDlg.SetMinLen(0);
+ if (!aPasswdDlg.run())
+ return false;
+ OUString aPasswd = aPasswdDlg.GetPassword();
+ aUtf8Passwd = OUStringToOString(aPasswd, RTL_TEXTENCODING_UTF8);
+ if (libwpd::WPD_PASSWORD_MATCH_OK
+ == libwpd::WPDocument::verifyPassword(&input, aUtf8Passwd.getStr()))
+ break;
+ else
+ unsuccessfulAttempts++;
+ if (unsuccessfulAttempts == 3) // timeout after 3 password attempts
+ return false;
+ }
+ }
+
+ // An XML import service: what we push sax messages to.
+ Reference<XDocumentHandler> xInternalHandler(
+ mxContext->getServiceManager()->createInstanceWithContext(
+ "com.sun.star.comp.Writer.XMLOasisImporter", mxContext),
+ css::uno::UNO_QUERY_THROW);
+
+ // The XImporter sets up an empty target document for XDocumentHandler to write to.
+ Reference<XImporter> xImporter(xInternalHandler, css::uno::UNO_QUERY);
+ xImporter->setTargetDocument(mxDoc);
+
+ // OO Document Handler: abstract class to handle document SAX messages, concrete implementation here
+ // writes to in-memory target doc
+ DocumentHandler aHandler(xInternalHandler);
+
+ OdtGenerator collector;
+ collector.addDocumentHandler(&aHandler, ODF_FLAT_XML);
+ collector.registerEmbeddedObjectHandler("image/x-wpg", &handleEmbeddedWPGObject);
+ collector.registerEmbeddedImageHandler("image/x-wpg", &handleEmbeddedWPGImage);
+ return libwpd::WPD_OK
+ == libwpd::WPDocument::parse(&input, &collector,
+ aUtf8Passwd.isEmpty() ? nullptr : aUtf8Passwd.getStr());
+}
+
+sal_Bool SAL_CALL
+WordPerfectImportFilter::filter(const css::uno::Sequence<css::beans::PropertyValue>& aDescriptor)
+{
+ return importImpl(aDescriptor);
+}
+void SAL_CALL WordPerfectImportFilter::cancel() {}
+
+// XImporter
+void SAL_CALL
+WordPerfectImportFilter::setTargetDocument(const Reference<css::lang::XComponent>& xDoc)
+{
+ mxDoc = xDoc;
+}
+
+// XExtendedFilterDetection
+OUString SAL_CALL
+WordPerfectImportFilter::detect(css::uno::Sequence<css::beans::PropertyValue>& Descriptor)
+{
+ libwpd::WPDConfidence confidence = libwpd::WPD_CONFIDENCE_NONE;
+ OUString sTypeName;
+ sal_Int32 nLength = Descriptor.getLength();
+ sal_Int32 location = nLength;
+ const css::beans::PropertyValue* pValue = Descriptor.getConstArray();
+ Reference<XInputStream> xInputStream;
+ for (sal_Int32 i = 0; i < nLength; i++)
+ {
+ if (pValue[i].Name == "TypeName")
+ location = i;
+ else if (pValue[i].Name == "InputStream")
+ pValue[i].Value >>= xInputStream;
+ }
+
+ if (!xInputStream.is())
+ return OUString();
+
+ WPXSvInputStream input(xInputStream);
+
+ confidence = libwpd::WPDocument::isFileFormatSupported(&input);
+
+ if (confidence == libwpd::WPD_CONFIDENCE_EXCELLENT
+ || confidence == libwpd::WPD_CONFIDENCE_SUPPORTED_ENCRYPTION)
+ sTypeName = "writer_WordPerfect_Document";
+
+ if (!sTypeName.isEmpty())
+ {
+ if (location == nLength)
+ {
+ Descriptor.realloc(nLength + 1);
+ Descriptor[location].Name = "TypeName";
+ }
+
+ Descriptor[location].Value <<= sTypeName;
+ }
+
+ return sTypeName;
+}
+
+// XInitialization
+void SAL_CALL
+WordPerfectImportFilter::initialize(const css::uno::Sequence<css::uno::Any>& /*aArguments*/)
+{
+}
+
+// XServiceInfo
+OUString SAL_CALL WordPerfectImportFilter::getImplementationName()
+{
+ return "com.sun.star.comp.Writer.WordPerfectImportFilter";
+}
+
+sal_Bool SAL_CALL WordPerfectImportFilter::supportsService(const OUString& rServiceName)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+css::uno::Sequence<OUString> SAL_CALL WordPerfectImportFilter::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.ImportFilter", "com.sun.star.document.ExtendedTypeDetection" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Writer_WordPerfectImportFilter_get_implementation(
+ css::uno::XComponentContext* const context, const css::uno::Sequence<css::uno::Any>&)
+{
+ return cppu::acquire(new WordPerfectImportFilter(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/WordPerfectImportFilter.hxx b/writerperfect/source/writer/WordPerfectImportFilter.hxx
new file mode 100644
index 000000000..2ed1f3c1f
--- /dev/null
+++ b/writerperfect/source/writer/WordPerfectImportFilter.hxx
@@ -0,0 +1,66 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+/* "This product is not manufactured, approved, or supported by
+ * Corel Corporation or Corel Corporation Limited."
+ */
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_WORDPERFECTIMPORTFILTER_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_WORDPERFECTIMPORTFILTER_HXX
+
+#include <com/sun/star/document/XFilter.hpp>
+#include <com/sun/star/document/XImporter.hpp>
+#include <com/sun/star/document/XExtendedFilterDetection.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <cppuhelper/implbase.hxx>
+
+/* This component will be instantiated for both import or export. Whether it calls
+ * setSourceDocument or setTargetDocument determines which Impl function the filter
+ * member calls */
+class WordPerfectImportFilter
+ : public cppu::WeakImplHelper<css::document::XFilter, css::document::XImporter,
+ css::document::XExtendedFilterDetection,
+ css::lang::XInitialization, css::lang::XServiceInfo>
+{
+ css::uno::Reference<css::uno::XComponentContext> mxContext;
+ css::uno::Reference<css::lang::XComponent> mxDoc;
+
+ /// @throws css::uno::RuntimeException
+ bool importImpl(const css::uno::Sequence<css::beans::PropertyValue>& aDescriptor);
+
+public:
+ explicit WordPerfectImportFilter(
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+ : mxContext(rxContext)
+ {
+ }
+
+ // XFilter
+ virtual sal_Bool SAL_CALL
+ filter(const css::uno::Sequence<css::beans::PropertyValue>& aDescriptor) override;
+ virtual void SAL_CALL cancel() override;
+
+ // XImporter
+ virtual void SAL_CALL
+ setTargetDocument(const css::uno::Reference<css::lang::XComponent>& xDoc) override;
+
+ //XExtendedFilterDetection
+ virtual OUString SAL_CALL
+ detect(css::uno::Sequence<css::beans::PropertyValue>& Descriptor) override;
+
+ // XInitialization
+ virtual void SAL_CALL initialize(const css::uno::Sequence<css::uno::Any>& aArguments) override;
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/XMLBase64ImportContext.cxx b/writerperfect/source/writer/exp/XMLBase64ImportContext.cxx
new file mode 100644
index 000000000..f281e39a4
--- /dev/null
+++ b/writerperfect/source/writer/exp/XMLBase64ImportContext.cxx
@@ -0,0 +1,65 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "XMLBase64ImportContext.hxx"
+
+#include <comphelper/base64.hxx>
+
+using namespace com::sun::star;
+
+namespace writerperfect::exp
+{
+XMLBase64ImportContext::XMLBase64ImportContext(XMLImport& rImport)
+ : XMLImportContext(rImport)
+{
+}
+
+void XMLBase64ImportContext::startElement(
+ const OUString& /*rName*/,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+}
+
+void XMLBase64ImportContext::endElement(const OUString& /*rName*/)
+{
+ m_aBinaryData.append(static_cast<const unsigned char*>(m_aStream.GetData()),
+ m_aStream.GetSize());
+}
+
+void XMLBase64ImportContext::characters(const OUString& rChars)
+{
+ OUString aTrimmedChars(rChars.trim());
+
+ if (!aTrimmedChars.isEmpty())
+ {
+ OUString aChars;
+ if (!m_aBase64CharsLeft.isEmpty())
+ {
+ aChars = m_aBase64CharsLeft + aTrimmedChars;
+ m_aBase64CharsLeft.clear();
+ }
+ else
+ aChars = aTrimmedChars;
+
+ uno::Sequence<sal_Int8> aBuffer((aChars.getLength() / 4) * 3);
+ const sal_Int32 nCharsDecoded = comphelper::Base64::decodeSomeChars(aBuffer, aChars);
+ m_aStream.WriteBytes(aBuffer.getArray(), aBuffer.getLength());
+ if (nCharsDecoded != aChars.getLength())
+ m_aBase64CharsLeft = aChars.copy(nCharsDecoded);
+ }
+}
+
+const librevenge::RVNGBinaryData& XMLBase64ImportContext::getBinaryData() const
+{
+ return m_aBinaryData;
+}
+
+} // namespace writerperfect::exp
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/XMLBase64ImportContext.hxx b/writerperfect/source/writer/exp/XMLBase64ImportContext.hxx
new file mode 100644
index 000000000..1fc1325fd
--- /dev/null
+++ b/writerperfect/source/writer/exp/XMLBase64ImportContext.hxx
@@ -0,0 +1,48 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLBASE64IMPORTCONTEXT_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLBASE64IMPORTCONTEXT_HXX
+
+#include <librevenge/RVNGBinaryData.h>
+
+#include <tools/stream.hxx>
+
+#include "xmlictxt.hxx"
+
+namespace writerperfect
+{
+namespace exp
+{
+/// Handler for <office:binary-data>.
+class XMLBase64ImportContext : public XMLImportContext
+{
+public:
+ XMLBase64ImportContext(XMLImport& rImport);
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+ void SAL_CALL endElement(const OUString& rName) override;
+ void SAL_CALL characters(const OUString& rChars) override;
+
+ const librevenge::RVNGBinaryData& getBinaryData() const;
+
+private:
+ librevenge::RVNGBinaryData m_aBinaryData;
+ SvMemoryStream m_aStream;
+ OUString m_aBase64CharsLeft;
+};
+
+} // namespace exp
+} // namespace writerperfect
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/XMLFootnoteImportContext.cxx b/writerperfect/source/writer/exp/XMLFootnoteImportContext.cxx
new file mode 100644
index 000000000..cdc08c50b
--- /dev/null
+++ b/writerperfect/source/writer/exp/XMLFootnoteImportContext.cxx
@@ -0,0 +1,126 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "XMLFootnoteImportContext.hxx"
+
+#include "xmlimp.hxx"
+#include "xmltext.hxx"
+
+#include <sal/log.hxx>
+
+using namespace com::sun::star;
+
+namespace writerperfect::exp
+{
+namespace
+{
+/// Handler for <text:note-citation>.
+class XMLTextNoteCitationContext : public XMLImportContext
+{
+public:
+ XMLTextNoteCitationContext(XMLImport& rImport, librevenge::RVNGPropertyList& rProperties);
+
+ void SAL_CALL characters(const OUString& rCharacters) override;
+ void SAL_CALL endElement(const OUString& rName) override;
+
+private:
+ librevenge::RVNGPropertyList& m_rProperties;
+ OUString m_aCharacters;
+};
+}
+
+XMLTextNoteCitationContext::XMLTextNoteCitationContext(XMLImport& rImport,
+ librevenge::RVNGPropertyList& rProperties)
+ : XMLImportContext(rImport)
+ , m_rProperties(rProperties)
+{
+}
+
+void XMLTextNoteCitationContext::endElement(const OUString& /*rName*/)
+{
+ m_rProperties.insert("librevenge:number", m_aCharacters.toUtf8().getStr());
+}
+
+void XMLTextNoteCitationContext::characters(const OUString& rCharacters)
+{
+ m_aCharacters += rCharacters;
+}
+
+namespace
+{
+/// Handler for <text:note-body>.
+class XMLFootnoteBodyImportContext : public XMLImportContext
+{
+public:
+ XMLFootnoteBodyImportContext(XMLImport& rImport,
+ const librevenge::RVNGPropertyList& rProperties);
+
+ rtl::Reference<XMLImportContext>
+ CreateChildContext(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+ void SAL_CALL endElement(const OUString& rName) override;
+
+private:
+ const librevenge::RVNGPropertyList& m_rProperties;
+};
+}
+
+XMLFootnoteBodyImportContext::XMLFootnoteBodyImportContext(
+ XMLImport& rImport, const librevenge::RVNGPropertyList& rProperties)
+ : XMLImportContext(rImport)
+ , m_rProperties(rProperties)
+{
+}
+
+rtl::Reference<XMLImportContext> XMLFootnoteBodyImportContext::CreateChildContext(
+ const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ return CreateTextChildContext(GetImport(), rName);
+}
+
+void XMLFootnoteBodyImportContext::startElement(
+ const OUString& /*rName*/,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ GetImport().GetGenerator().openFootnote(m_rProperties);
+}
+
+void XMLFootnoteBodyImportContext::endElement(const OUString& /*rName*/)
+{
+ GetImport().GetGenerator().closeFootnote();
+}
+
+XMLFootnoteImportContext::XMLFootnoteImportContext(XMLImport& rImport)
+ : XMLImportContext(rImport)
+{
+}
+
+rtl::Reference<XMLImportContext> XMLFootnoteImportContext::CreateChildContext(
+ const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ if (rName == "text:note-citation")
+ return new XMLTextNoteCitationContext(GetImport(), m_aProperties);
+ if (rName == "text:note-body")
+ return new XMLFootnoteBodyImportContext(GetImport(), m_aProperties);
+ SAL_WARN("writerperfect", "XMLFootnoteImportContext::CreateChildContext: unhandled " << rName);
+ return nullptr;
+}
+
+void XMLFootnoteImportContext::startElement(
+ const OUString& /*rName*/,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+}
+} // namespace writerperfect::exp
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/XMLFootnoteImportContext.hxx b/writerperfect/source/writer/exp/XMLFootnoteImportContext.hxx
new file mode 100644
index 000000000..22594f2dd
--- /dev/null
+++ b/writerperfect/source/writer/exp/XMLFootnoteImportContext.hxx
@@ -0,0 +1,46 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLFOOTNOTEIMPORTCONTEXT_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLFOOTNOTEIMPORTCONTEXT_HXX
+
+#include <librevenge/librevenge.h>
+
+#include <rtl/ref.hxx>
+
+#include "xmlictxt.hxx"
+
+namespace writerperfect
+{
+namespace exp
+{
+/// Handler for <text:note>.
+class XMLFootnoteImportContext : public XMLImportContext
+{
+public:
+ XMLFootnoteImportContext(XMLImport& rImport);
+
+ rtl::Reference<XMLImportContext>
+ CreateChildContext(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+private:
+ librevenge::RVNGPropertyList m_aProperties;
+};
+
+} // namespace exp
+} // namespace writerperfect
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/XMLSectionContext.cxx b/writerperfect/source/writer/exp/XMLSectionContext.cxx
new file mode 100644
index 000000000..839400e52
--- /dev/null
+++ b/writerperfect/source/writer/exp/XMLSectionContext.cxx
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "XMLSectionContext.hxx"
+
+#include "xmlimp.hxx"
+#include "xmltext.hxx"
+
+using namespace com::sun::star;
+
+namespace writerperfect::exp
+{
+XMLSectionContext::XMLSectionContext(XMLImport& rImport)
+ : XMLImportContext(rImport)
+{
+}
+
+rtl::Reference<XMLImportContext> XMLSectionContext::CreateChildContext(
+ const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ return CreateTextChildContext(GetImport(), rName);
+}
+
+void XMLSectionContext::startElement(
+ const OUString& /*rName*/,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ GetImport().GetGenerator().openSection(librevenge::RVNGPropertyList());
+}
+
+void XMLSectionContext::endElement(const OUString& /*rName*/)
+{
+ GetImport().GetGenerator().closeSection();
+}
+
+} // namespace writerperfect::exp
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/XMLSectionContext.hxx b/writerperfect/source/writer/exp/XMLSectionContext.hxx
new file mode 100644
index 000000000..20c4047c0
--- /dev/null
+++ b/writerperfect/source/writer/exp/XMLSectionContext.hxx
@@ -0,0 +1,39 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLSECTIONCONTEXT_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLSECTIONCONTEXT_HXX
+
+#include "xmlictxt.hxx"
+
+namespace writerperfect
+{
+namespace exp
+{
+/// Handler for <text:section>.
+class XMLSectionContext : public XMLImportContext
+{
+public:
+ XMLSectionContext(XMLImport& rImport);
+
+ rtl::Reference<XMLImportContext>
+ CreateChildContext(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+ void SAL_CALL endElement(const OUString& rName) override;
+};
+
+} // namespace exp
+} // namespace writerperfect
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/XMLTextFrameContext.cxx b/writerperfect/source/writer/exp/XMLTextFrameContext.cxx
new file mode 100644
index 000000000..60cc3d87f
--- /dev/null
+++ b/writerperfect/source/writer/exp/XMLTextFrameContext.cxx
@@ -0,0 +1,171 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "XMLTextFrameContext.hxx"
+
+#include "XMLBase64ImportContext.hxx"
+#include "txtparai.hxx"
+#include "xmlimp.hxx"
+#include "xmltext.hxx"
+
+#include <sal/log.hxx>
+
+using namespace com::sun::star;
+
+namespace writerperfect::exp
+{
+namespace
+{
+/// Handler for <draw:text-box>.
+class XMLTextBoxContext : public XMLImportContext
+{
+public:
+ XMLTextBoxContext(XMLImport& rImport);
+
+ rtl::Reference<XMLImportContext>
+ CreateChildContext(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+ void SAL_CALL endElement(const OUString& rName) override;
+};
+}
+
+XMLTextBoxContext::XMLTextBoxContext(XMLImport& rImport)
+ : XMLImportContext(rImport)
+{
+}
+
+rtl::Reference<XMLImportContext> XMLTextBoxContext::CreateChildContext(
+ const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ return CreateTextChildContext(GetImport(), rName);
+}
+
+void XMLTextBoxContext::startElement(
+ const OUString& /*rName*/,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ GetImport().GetGenerator().openTextBox(librevenge::RVNGPropertyList());
+}
+
+void XMLTextBoxContext::endElement(const OUString& /*rName*/)
+{
+ GetImport().GetGenerator().closeTextBox();
+}
+
+namespace
+{
+/// Handler for <draw:image>.
+class XMLTextImageContext : public XMLImportContext
+{
+public:
+ XMLTextImageContext(XMLImport& rImport);
+
+ rtl::Reference<XMLImportContext>
+ CreateChildContext(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+ void SAL_CALL endElement(const OUString& rName) override;
+
+private:
+ OString m_aMimeType;
+ rtl::Reference<XMLBase64ImportContext> m_xBinaryData;
+};
+}
+
+XMLTextImageContext::XMLTextImageContext(XMLImport& rImport)
+ : XMLImportContext(rImport)
+{
+}
+
+rtl::Reference<XMLImportContext> XMLTextImageContext::CreateChildContext(
+ const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ if (rName == "office:binary-data")
+ {
+ m_xBinaryData = new XMLBase64ImportContext(GetImport());
+ return m_xBinaryData.get();
+ }
+ return nullptr;
+}
+
+void XMLTextImageContext::startElement(
+ const OUString& /*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
+{
+ for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
+ {
+ const OUString& rAttributeName = xAttribs->getNameByIndex(i);
+ if (rAttributeName == "loext:mime-type" || rAttributeName == "draw:mime-type")
+ m_aMimeType = OUStringToOString(xAttribs->getValueByIndex(i), RTL_TEXTENCODING_UTF8);
+ }
+}
+
+void XMLTextImageContext::endElement(const OUString& /*rName*/)
+{
+ librevenge::RVNGPropertyList aPropertyList;
+
+ aPropertyList.insert("librevenge:mime-type", m_aMimeType.getStr());
+ if (m_xBinaryData.is())
+ aPropertyList.insert("office:binary-data", m_xBinaryData->getBinaryData());
+
+ GetImport().GetGenerator().insertBinaryObject(aPropertyList);
+}
+
+XMLTextFrameContext::XMLTextFrameContext(XMLImport& rImport)
+ : XMLImportContext(rImport)
+{
+}
+
+rtl::Reference<XMLImportContext> XMLTextFrameContext::CreateChildContext(
+ const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ if (rName == "draw:image")
+ return new XMLTextImageContext(GetImport());
+ if (rName == "draw:text-box")
+ return new XMLTextBoxContext(GetImport());
+ SAL_WARN("writerperfect", "XMLTextFrameContext::CreateChildContext: unhandled " << rName);
+ return nullptr;
+}
+
+void XMLTextFrameContext::startElement(
+ const OUString& /*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
+{
+ librevenge::RVNGPropertyList aPropertyList;
+ for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
+ {
+ const OUString& rAttributeName = xAttribs->getNameByIndex(i);
+ const OUString& rAttributeValue = xAttribs->getValueByIndex(i);
+
+ if (rAttributeName == "draw:style-name")
+ FillStyles(rAttributeValue, GetImport().GetAutomaticGraphicStyles(),
+ GetImport().GetGraphicStyles(), aPropertyList);
+ else
+ {
+ OString sName = OUStringToOString(rAttributeName, RTL_TEXTENCODING_UTF8);
+ OString sValue = OUStringToOString(rAttributeValue, RTL_TEXTENCODING_UTF8);
+ aPropertyList.insert(sName.getStr(), sValue.getStr());
+ }
+ }
+ GetImport().GetGenerator().openFrame(aPropertyList);
+}
+
+void XMLTextFrameContext::endElement(const OUString& /*rName*/)
+{
+ GetImport().GetGenerator().closeFrame();
+}
+
+} // namespace writerperfect::exp
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/XMLTextFrameContext.hxx b/writerperfect/source/writer/exp/XMLTextFrameContext.hxx
new file mode 100644
index 000000000..fa8c52123
--- /dev/null
+++ b/writerperfect/source/writer/exp/XMLTextFrameContext.hxx
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLTEXTFRAMECONTEXT_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLTEXTFRAMECONTEXT_HXX
+
+#include <rtl/ref.hxx>
+
+#include "xmlictxt.hxx"
+
+namespace writerperfect
+{
+namespace exp
+{
+class XMLBase64ImportContext;
+
+/// Handler for <draw:frame>.
+class XMLTextFrameContext : public XMLImportContext
+{
+public:
+ XMLTextFrameContext(XMLImport& rImport);
+
+ rtl::Reference<XMLImportContext>
+ CreateChildContext(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+ void SAL_CALL endElement(const OUString& rName) override;
+};
+
+} // namespace exp
+} // namespace writerperfect
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/XMLTextListContext.cxx b/writerperfect/source/writer/exp/XMLTextListContext.cxx
new file mode 100644
index 000000000..8798c9a39
--- /dev/null
+++ b/writerperfect/source/writer/exp/XMLTextListContext.cxx
@@ -0,0 +1,33 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "XMLTextListContext.hxx"
+
+#include "XMLTextListItemContext.hxx"
+
+using namespace com::sun::star;
+
+namespace writerperfect::exp
+{
+XMLTextListContext::XMLTextListContext(XMLImport& rImport)
+ : XMLImportContext(rImport)
+{
+}
+
+rtl::Reference<XMLImportContext> XMLTextListContext::CreateChildContext(
+ const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ if (rName == "text:list-item")
+ return new XMLTextListItemContext(GetImport());
+ return nullptr;
+}
+
+} // namespace writerperfect::exp
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/XMLTextListContext.hxx b/writerperfect/source/writer/exp/XMLTextListContext.hxx
new file mode 100644
index 000000000..d5145465d
--- /dev/null
+++ b/writerperfect/source/writer/exp/XMLTextListContext.hxx
@@ -0,0 +1,35 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLTEXTLISTCONTEXT_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLTEXTLISTCONTEXT_HXX
+
+#include "xmlictxt.hxx"
+
+namespace writerperfect
+{
+namespace exp
+{
+/// Handler for <text:list>.
+class XMLTextListContext : public XMLImportContext
+{
+public:
+ XMLTextListContext(XMLImport& rImport);
+
+ rtl::Reference<XMLImportContext>
+ CreateChildContext(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+};
+
+} // namespace exp
+} // namespace writerperfect
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/XMLTextListItemContext.cxx b/writerperfect/source/writer/exp/XMLTextListItemContext.cxx
new file mode 100644
index 000000000..36f3f2ce6
--- /dev/null
+++ b/writerperfect/source/writer/exp/XMLTextListItemContext.cxx
@@ -0,0 +1,36 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "XMLTextListItemContext.hxx"
+
+#include "XMLTextListContext.hxx"
+#include "txtparai.hxx"
+
+using namespace com::sun::star;
+
+namespace writerperfect::exp
+{
+XMLTextListItemContext::XMLTextListItemContext(XMLImport& rImport)
+ : XMLImportContext(rImport)
+{
+}
+
+rtl::Reference<XMLImportContext> XMLTextListItemContext::CreateChildContext(
+ const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ if (rName == "text:p" || rName == "text:h")
+ return new XMLParaContext(GetImport());
+ if (rName == "text:list")
+ return new XMLTextListContext(GetImport());
+ return nullptr;
+}
+
+} // namespace writerperfect::exp
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/XMLTextListItemContext.hxx b/writerperfect/source/writer/exp/XMLTextListItemContext.hxx
new file mode 100644
index 000000000..c66fac6a2
--- /dev/null
+++ b/writerperfect/source/writer/exp/XMLTextListItemContext.hxx
@@ -0,0 +1,35 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLTEXTLISTITEMCONTEXT_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLTEXTLISTITEMCONTEXT_HXX
+
+#include "xmlictxt.hxx"
+
+namespace writerperfect
+{
+namespace exp
+{
+/// Handler for <text:list-item>.
+class XMLTextListItemContext : public XMLImportContext
+{
+public:
+ XMLTextListItemContext(XMLImport& rImport);
+
+ rtl::Reference<XMLImportContext>
+ CreateChildContext(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+};
+
+} // namespace exp
+} // namespace writerperfect
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/txtparai.cxx b/writerperfect/source/writer/exp/txtparai.cxx
new file mode 100644
index 000000000..11dfd8cfe
--- /dev/null
+++ b/writerperfect/source/writer/exp/txtparai.cxx
@@ -0,0 +1,630 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "txtparai.hxx"
+
+#include "XMLFootnoteImportContext.hxx"
+#include "XMLTextFrameContext.hxx"
+#include "xmlimp.hxx"
+
+#include <sal/log.hxx>
+
+using namespace com::sun::star;
+
+namespace
+{
+/// Looks for rName in rStyles and fills rPropertyList based on that
+/// (rAutomaticStyles and rNamedStyles are a list of possible parents).
+void FillStyle(const OUString& rName, std::map<OUString, librevenge::RVNGPropertyList>& rStyles,
+ std::map<OUString, librevenge::RVNGPropertyList>& rAutomaticStyles,
+ std::map<OUString, librevenge::RVNGPropertyList>& rNamedStyles,
+ librevenge::RVNGPropertyList& rPropertyList)
+{
+ auto itStyle = rStyles.find(rName);
+ if (itStyle == rStyles.end())
+ return;
+
+ const librevenge::RVNGPropertyList& rStyle = itStyle->second;
+ if (rStyle["style:parent-style-name"])
+ {
+ // The style has a parent.
+ OUString aParent = OStringToOUString(rStyle["style:parent-style-name"]->getStr().cstr(),
+ RTL_TEXTENCODING_UTF8);
+ if (!aParent.isEmpty())
+ writerperfect::exp::FillStyles(aParent, rAutomaticStyles, rNamedStyles, rPropertyList);
+ }
+
+ // Apply properties from named style.
+ librevenge::RVNGPropertyList::Iter itProp(rStyle);
+ for (itProp.rewind(); itProp.next();)
+ {
+ if (OString("style:parent-style-name") != itProp.key())
+ rPropertyList.insert(itProp.key(), itProp()->clone());
+ }
+}
+}
+
+namespace writerperfect::exp
+{
+namespace
+{
+/// Handler for <text:sequence>.
+class XMLTextSequenceContext : public XMLImportContext
+{
+public:
+ XMLTextSequenceContext(XMLImport& rImport, const librevenge::RVNGPropertyList& rPropertyList);
+
+ void SAL_CALL characters(const OUString& rChars) override;
+
+private:
+ librevenge::RVNGPropertyList m_aPropertyList;
+};
+}
+
+XMLTextSequenceContext::XMLTextSequenceContext(XMLImport& rImport,
+ const librevenge::RVNGPropertyList& rPropertyList)
+ : XMLImportContext(rImport)
+{
+ // Inherit properties from parent.
+ librevenge::RVNGPropertyList::Iter itProp(rPropertyList);
+ for (itProp.rewind(); itProp.next();)
+ m_aPropertyList.insert(itProp.key(), itProp()->clone());
+}
+
+void XMLTextSequenceContext::characters(const OUString& rChars)
+{
+ GetImport().GetGenerator().openSpan(m_aPropertyList);
+
+ OString sCharU8 = OUStringToOString(rChars, RTL_TEXTENCODING_UTF8);
+ GetImport().GetGenerator().insertText(librevenge::RVNGString(sCharU8.getStr()));
+
+ GetImport().GetGenerator().closeSpan();
+}
+
+namespace
+{
+/// Handler for <text:span>.
+class XMLSpanContext : public XMLImportContext
+{
+public:
+ XMLSpanContext(XMLImport& rImport, const librevenge::RVNGPropertyList& rPropertyList);
+
+ rtl::Reference<XMLImportContext>
+ CreateChildContext(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+ void SAL_CALL characters(const OUString& rChars) override;
+
+private:
+ librevenge::RVNGPropertyList m_aPropertyList;
+};
+}
+
+XMLSpanContext::XMLSpanContext(XMLImport& rImport,
+ const librevenge::RVNGPropertyList& rPropertyList)
+ : XMLImportContext(rImport)
+{
+ // Inherit properties from parent.
+ librevenge::RVNGPropertyList::Iter itProp(rPropertyList);
+ for (itProp.rewind(); itProp.next();)
+ m_aPropertyList.insert(itProp.key(), itProp()->clone());
+}
+
+rtl::Reference<XMLImportContext> XMLSpanContext::CreateChildContext(
+ const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ return CreateParagraphOrSpanChildContext(GetImport(), rName, m_aPropertyList);
+}
+
+void XMLSpanContext::startElement(
+ const OUString& /*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
+{
+ for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
+ {
+ const OUString& rAttributeName = xAttribs->getNameByIndex(i);
+ const OUString& rAttributeValue = xAttribs->getValueByIndex(i);
+ if (rAttributeName == "text:style-name")
+ FillStyles(rAttributeValue, GetImport().GetAutomaticTextStyles(),
+ GetImport().GetTextStyles(), m_aPropertyList);
+ else
+ {
+ OString sName = OUStringToOString(rAttributeName, RTL_TEXTENCODING_UTF8);
+ OString sValue = OUStringToOString(rAttributeValue, RTL_TEXTENCODING_UTF8);
+ m_aPropertyList.insert(sName.getStr(), sValue.getStr());
+ }
+ }
+}
+
+void XMLSpanContext::characters(const OUString& rChars)
+{
+ GetImport().GetGenerator().openSpan(m_aPropertyList);
+
+ OString sCharU8 = OUStringToOString(rChars, RTL_TEXTENCODING_UTF8);
+ GetImport().GetGenerator().insertText(librevenge::RVNGString(sCharU8.getStr()));
+
+ GetImport().GetGenerator().closeSpan();
+}
+
+namespace
+{
+/// Handler for <text:ruby>.
+class XMLRubyContext : public XMLImportContext
+{
+public:
+ XMLRubyContext(XMLImport& rImport, const librevenge::RVNGPropertyList& rPropertyList);
+
+ rtl::Reference<XMLImportContext>
+ CreateChildContext(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+ void SAL_CALL endElement(const OUString& rName) override;
+
+ void SetRubyText(const OUString& rRubyText) { m_sRubyText = rRubyText; }
+
+ OUString& GetRubyBase() { return m_sRubyBase; }
+
+private:
+ OUString m_sRubyText;
+ OUString m_sRubyBase;
+ librevenge::RVNGPropertyList m_aPropertyList;
+};
+
+/// Handler for <text:ruby-text>.
+class XMLRubyTextContext : public XMLImportContext
+{
+public:
+ XMLRubyTextContext(XMLImport& rImport, XMLRubyContext& rParent)
+ : XMLImportContext(rImport)
+ , m_rParent(rParent)
+ {
+ }
+
+ void SAL_CALL characters(const OUString& rChars) override { m_rParent.SetRubyText(rChars); }
+
+private:
+ XMLRubyContext& m_rParent;
+};
+
+/// Handler for <text:ruby-base>.
+class XMLRubyBaseContext : public XMLImportContext
+{
+public:
+ XMLRubyBaseContext(XMLImport& rImport, XMLRubyContext& rParent)
+ : XMLImportContext(rImport)
+ , m_rParent(rParent)
+ {
+ }
+
+ void SAL_CALL characters(const OUString& rChars) override { m_rParent.GetRubyBase() += rChars; }
+
+private:
+ XMLRubyContext& m_rParent;
+};
+}
+
+XMLRubyContext::XMLRubyContext(XMLImport& rImport,
+ const librevenge::RVNGPropertyList& rPropertyList)
+ : XMLImportContext(rImport)
+{
+ // Inherit properties from parent.
+ librevenge::RVNGPropertyList::Iter itProp(rPropertyList);
+ for (itProp.rewind(); itProp.next();)
+ m_aPropertyList.insert(itProp.key(), itProp()->clone());
+}
+
+rtl::Reference<XMLImportContext> XMLRubyContext::CreateChildContext(
+ const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ if (rName == "text:ruby-base")
+ return new XMLRubyBaseContext(GetImport(), *this);
+ if (rName == "text:ruby-text")
+ return new XMLRubyTextContext(GetImport(), *this);
+ return nullptr;
+}
+
+void XMLRubyContext::endElement(const OUString& /*rName*/)
+{
+ OString sRubyText = OUStringToOString(m_sRubyText, RTL_TEXTENCODING_UTF8);
+ OString sRubyBase = OUStringToOString(m_sRubyBase, RTL_TEXTENCODING_UTF8);
+ if (sRubyText.getLength())
+ m_aPropertyList.insert("text:ruby-text", sRubyText.getStr());
+ GetImport().GetGenerator().openSpan(m_aPropertyList);
+ GetImport().GetGenerator().insertText(sRubyBase.getStr());
+ GetImport().GetGenerator().closeSpan();
+}
+
+namespace
+{
+/// Base class for contexts that represent a single character only.
+class XMLCharContext : public XMLImportContext
+{
+public:
+ XMLCharContext(XMLImport& rImport, const librevenge::RVNGPropertyList& rPropertyList);
+
+ const librevenge::RVNGPropertyList& GetPropertyList() const { return m_aPropertyList; }
+
+private:
+ librevenge::RVNGPropertyList m_aPropertyList;
+};
+}
+
+XMLCharContext::XMLCharContext(XMLImport& rImport,
+ const librevenge::RVNGPropertyList& rPropertyList)
+ : XMLImportContext(rImport)
+{
+ // Inherit properties from parent.
+ librevenge::RVNGPropertyList::Iter itProp(rPropertyList);
+ for (itProp.rewind(); itProp.next();)
+ m_aPropertyList.insert(itProp.key(), itProp()->clone());
+}
+
+namespace
+{
+/// Handler for <text:line-break>.
+class XMLLineBreakContext : public XMLCharContext
+{
+public:
+ XMLLineBreakContext(XMLImport& rImport, const librevenge::RVNGPropertyList& rPropertyList);
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+};
+}
+
+XMLLineBreakContext::XMLLineBreakContext(XMLImport& rImport,
+ const librevenge::RVNGPropertyList& rPropertyList)
+ : XMLCharContext(rImport, rPropertyList)
+{
+}
+
+void XMLLineBreakContext::startElement(
+ const OUString& /*rName*/,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ GetImport().GetGenerator().openSpan(GetPropertyList());
+ GetImport().GetGenerator().insertLineBreak();
+ GetImport().GetGenerator().closeSpan();
+}
+
+namespace
+{
+/// Handler for <text:s>.
+class XMLSpaceContext : public XMLCharContext
+{
+public:
+ XMLSpaceContext(XMLImport& rImport, const librevenge::RVNGPropertyList& rPropertyList);
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+};
+}
+
+XMLSpaceContext::XMLSpaceContext(XMLImport& rImport,
+ const librevenge::RVNGPropertyList& rPropertyList)
+ : XMLCharContext(rImport, rPropertyList)
+{
+}
+
+void XMLSpaceContext::startElement(
+ const OUString& /*rName*/,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ GetImport().GetGenerator().openSpan(GetPropertyList());
+ GetImport().GetGenerator().insertSpace();
+ GetImport().GetGenerator().closeSpan();
+}
+
+namespace
+{
+/// Handler for <text:tab>.
+class XMLTabContext : public XMLCharContext
+{
+public:
+ XMLTabContext(XMLImport& rImport, const librevenge::RVNGPropertyList& rPropertyList);
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+};
+}
+
+XMLTabContext::XMLTabContext(XMLImport& rImport, const librevenge::RVNGPropertyList& rPropertyList)
+ : XMLCharContext(rImport, rPropertyList)
+{
+}
+
+void XMLTabContext::startElement(
+ const OUString& /*rName*/,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ GetImport().GetGenerator().openSpan(GetPropertyList());
+ GetImport().GetGenerator().insertTab();
+ GetImport().GetGenerator().closeSpan();
+}
+
+namespace
+{
+/// Handler for <draw:a>.
+class XMLTextFrameHyperlinkContext : public XMLImportContext
+{
+public:
+ XMLTextFrameHyperlinkContext(XMLImport& rImport,
+ const librevenge::RVNGPropertyList& rPropertyList);
+ rtl::Reference<XMLImportContext>
+ CreateChildContext(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+ void SAL_CALL endElement(const OUString& rName) override;
+ void SAL_CALL characters(const OUString& rChars) override;
+
+private:
+ librevenge::RVNGPropertyList m_aPropertyList;
+ PopupState m_ePopupState = PopupState::NONE;
+};
+}
+
+XMLTextFrameHyperlinkContext::XMLTextFrameHyperlinkContext(
+ XMLImport& rImport, const librevenge::RVNGPropertyList& rPropertyList)
+ : XMLImportContext(rImport)
+{
+ // Inherit properties from parent.
+ librevenge::RVNGPropertyList::Iter itProp(rPropertyList);
+ for (itProp.rewind(); itProp.next();)
+ m_aPropertyList.insert(itProp.key(), itProp()->clone());
+}
+
+rtl::Reference<XMLImportContext> XMLTextFrameHyperlinkContext::CreateChildContext(
+ const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ return CreateParagraphOrSpanChildContext(GetImport(), rName, m_aPropertyList);
+}
+
+void XMLTextFrameHyperlinkContext::startElement(
+ const OUString& /*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
+{
+ librevenge::RVNGPropertyList aPropertyList;
+ for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
+ {
+ const OUString& rAttributeName = xAttribs->getNameByIndex(i);
+ const OUString& rAttributeValue = xAttribs->getValueByIndex(i);
+ if (rAttributeName == "text:style-name")
+ // This affects the nested span's properties.
+ FillStyles(rAttributeValue, GetImport().GetAutomaticTextStyles(),
+ GetImport().GetTextStyles(), m_aPropertyList);
+ else
+ {
+ if (rAttributeName == "xlink:href")
+ {
+ m_ePopupState = GetImport().FillPopupData(rAttributeValue, aPropertyList);
+ if (m_ePopupState != PopupState::NotConsumed)
+ continue;
+ }
+
+ // This affects the link's properties.
+ OString sName = OUStringToOString(rAttributeName, RTL_TEXTENCODING_UTF8);
+ OString sValue = OUStringToOString(rAttributeValue, RTL_TEXTENCODING_UTF8);
+ aPropertyList.insert(sName.getStr(), sValue.getStr());
+ }
+ }
+
+ if (m_ePopupState != PopupState::Ignore)
+ GetImport().GetGenerator().openLink(aPropertyList);
+}
+
+void XMLTextFrameHyperlinkContext::endElement(const OUString& /*rName*/)
+{
+ if (m_ePopupState != PopupState::Ignore)
+ GetImport().GetGenerator().closeLink();
+}
+
+void XMLTextFrameHyperlinkContext::characters(const OUString& rChars)
+{
+ GetImport().GetGenerator().openSpan(m_aPropertyList);
+
+ OString sCharU8 = OUStringToOString(rChars, RTL_TEXTENCODING_UTF8);
+ GetImport().GetGenerator().insertText(librevenge::RVNGString(sCharU8.getStr()));
+
+ GetImport().GetGenerator().closeSpan();
+}
+
+namespace
+{
+/// Handler for <text:a>.
+class XMLHyperlinkContext : public XMLImportContext
+{
+public:
+ XMLHyperlinkContext(XMLImport& rImport, const librevenge::RVNGPropertyList& rPropertyList);
+ rtl::Reference<XMLImportContext>
+ CreateChildContext(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+ void SAL_CALL endElement(const OUString& rName) override;
+ void SAL_CALL characters(const OUString& rChars) override;
+
+private:
+ librevenge::RVNGPropertyList m_aPropertyList;
+ PopupState m_ePopupState = PopupState::NONE;
+};
+}
+
+XMLHyperlinkContext::XMLHyperlinkContext(XMLImport& rImport,
+ const librevenge::RVNGPropertyList& rPropertyList)
+ : XMLImportContext(rImport)
+{
+ // Inherit properties from parent.
+ librevenge::RVNGPropertyList::Iter itProp(rPropertyList);
+ for (itProp.rewind(); itProp.next();)
+ m_aPropertyList.insert(itProp.key(), itProp()->clone());
+}
+
+rtl::Reference<XMLImportContext> XMLHyperlinkContext::CreateChildContext(
+ const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ return CreateParagraphOrSpanChildContext(GetImport(), rName, m_aPropertyList);
+}
+
+void XMLHyperlinkContext::startElement(
+ const OUString& /*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
+{
+ librevenge::RVNGPropertyList aPropertyList;
+ for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
+ {
+ const OUString& rAttributeName = xAttribs->getNameByIndex(i);
+ const OUString& rAttributeValue = xAttribs->getValueByIndex(i);
+ if (rAttributeName == "text:style-name")
+ // This affects the nested span's properties.
+ FillStyles(rAttributeValue, GetImport().GetAutomaticTextStyles(),
+ GetImport().GetTextStyles(), m_aPropertyList);
+ else
+ {
+ if (rAttributeName == "xlink:href")
+ {
+ m_ePopupState = GetImport().FillPopupData(rAttributeValue, aPropertyList);
+ if (m_ePopupState != PopupState::NotConsumed)
+ continue;
+ }
+
+ // This affects the link's properties.
+ OString sName = OUStringToOString(rAttributeName, RTL_TEXTENCODING_UTF8);
+ OString sValue = OUStringToOString(rAttributeValue, RTL_TEXTENCODING_UTF8);
+ aPropertyList.insert(sName.getStr(), sValue.getStr());
+ }
+ }
+
+ if (m_ePopupState != PopupState::Ignore)
+ GetImport().GetGenerator().openLink(aPropertyList);
+}
+
+void XMLHyperlinkContext::endElement(const OUString& /*rName*/)
+{
+ if (m_ePopupState != PopupState::Ignore)
+ GetImport().GetGenerator().closeLink();
+}
+
+void XMLHyperlinkContext::characters(const OUString& rChars)
+{
+ GetImport().GetGenerator().openSpan(m_aPropertyList);
+
+ OString sCharU8 = OUStringToOString(rChars, RTL_TEXTENCODING_UTF8);
+ GetImport().GetGenerator().insertText(librevenge::RVNGString(sCharU8.getStr()));
+
+ GetImport().GetGenerator().closeSpan();
+}
+
+XMLParaContext::XMLParaContext(XMLImport& rImport, bool bTopLevel)
+ : XMLImportContext(rImport)
+ , m_bTopLevel(bTopLevel)
+{
+}
+
+rtl::Reference<XMLImportContext> XMLParaContext::CreateChildContext(
+ const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ if (rName == "text:a")
+ return new XMLHyperlinkContext(GetImport(), m_aTextPropertyList);
+ if (rName == "draw:a")
+ return new XMLTextFrameHyperlinkContext(GetImport(), m_aTextPropertyList);
+ if (rName == "text:ruby")
+ return new XMLRubyContext(GetImport(), m_aTextPropertyList);
+ return CreateParagraphOrSpanChildContext(GetImport(), rName, m_aTextPropertyList);
+}
+
+void XMLParaContext::startElement(
+ const OUString& /*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
+{
+ librevenge::RVNGPropertyList aPropertyList;
+ for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
+ {
+ const OUString& rAttributeName = xAttribs->getNameByIndex(i);
+ const OUString& rAttributeValue = xAttribs->getValueByIndex(i);
+ if (rAttributeName == "text:style-name")
+ {
+ m_aStyleName = rAttributeValue;
+ FillStyles(m_aStyleName, GetImport().GetAutomaticParagraphStyles(),
+ GetImport().GetParagraphStyles(), aPropertyList);
+ FillStyles(m_aStyleName, GetImport().GetAutomaticTextStyles(),
+ GetImport().GetTextStyles(), m_aTextPropertyList);
+ if (m_bTopLevel)
+ GetImport().HandlePageSpan(aPropertyList);
+ }
+ else
+ {
+ OString sName = OUStringToOString(rAttributeName, RTL_TEXTENCODING_UTF8);
+ OString sValue = OUStringToOString(rAttributeValue, RTL_TEXTENCODING_UTF8);
+ aPropertyList.insert(sName.getStr(), sValue.getStr());
+ }
+ }
+
+ GetImport().GetGenerator().openParagraph(aPropertyList);
+}
+
+void XMLParaContext::endElement(const OUString& /*rName*/)
+{
+ GetImport().GetGenerator().closeParagraph();
+}
+
+void XMLParaContext::characters(const OUString& rChars)
+{
+ librevenge::RVNGPropertyList aPropertyList;
+ if (!m_aStyleName.isEmpty())
+ FillStyles(m_aStyleName, GetImport().GetAutomaticTextStyles(), GetImport().GetTextStyles(),
+ aPropertyList);
+ GetImport().GetGenerator().openSpan(aPropertyList);
+
+ OString sCharU8 = OUStringToOString(rChars, RTL_TEXTENCODING_UTF8);
+ GetImport().GetGenerator().insertText(librevenge::RVNGString(sCharU8.getStr()));
+
+ GetImport().GetGenerator().closeSpan();
+}
+
+rtl::Reference<XMLImportContext>
+CreateParagraphOrSpanChildContext(XMLImport& rImport, const OUString& rName,
+ const librevenge::RVNGPropertyList& rTextPropertyList)
+{
+ if (rName == "text:span")
+ return new XMLSpanContext(rImport, rTextPropertyList);
+ if (rName == "text:line-break")
+ return new XMLLineBreakContext(rImport, rTextPropertyList);
+ if (rName == "text:s")
+ return new XMLSpaceContext(rImport, rTextPropertyList);
+ if (rName == "text:tab")
+ return new XMLTabContext(rImport, rTextPropertyList);
+ if (rName == "draw:frame")
+ return new XMLTextFrameContext(rImport);
+ if (rName == "text:sequence")
+ return new XMLTextSequenceContext(rImport, rTextPropertyList);
+ if (rName == "text:note")
+ return new XMLFootnoteImportContext(rImport);
+ SAL_WARN("writerperfect", "CreateParagraphOrSpanChildContext: unhandled " << rName);
+ return nullptr;
+}
+
+void FillStyles(const OUString& rName,
+ std::map<OUString, librevenge::RVNGPropertyList>& rAutomaticStyles,
+ std::map<OUString, librevenge::RVNGPropertyList>& rNamedStyles,
+ librevenge::RVNGPropertyList& rPropertyList)
+{
+ FillStyle(rName, rAutomaticStyles, rAutomaticStyles, rNamedStyles, rPropertyList);
+ FillStyle(rName, rNamedStyles, rAutomaticStyles, rNamedStyles, rPropertyList);
+}
+
+} // namespace writerperfect
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/txtparai.hxx b/writerperfect/source/writer/exp/txtparai.hxx
new file mode 100644
index 000000000..561be4f0a
--- /dev/null
+++ b/writerperfect/source/writer/exp/txtparai.hxx
@@ -0,0 +1,65 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_TXTPARAI_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_TXTPARAI_HXX
+
+#include <map>
+
+#include <librevenge/librevenge.h>
+
+#include "xmlictxt.hxx"
+
+namespace writerperfect
+{
+namespace exp
+{
+/// Handler for <text:p>/<text:h>.
+class XMLParaContext : public XMLImportContext
+{
+public:
+ XMLParaContext(XMLImport& rImport, bool bTopLevel = false);
+
+ rtl::Reference<XMLImportContext> CreateChildContext(
+ const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/) override;
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+ void SAL_CALL endElement(const OUString& rName) override;
+ void SAL_CALL characters(const OUString& rChars) override;
+
+private:
+ OUString m_aStyleName;
+ /// List of properties spans should inherit from this paragraph.
+ librevenge::RVNGPropertyList m_aTextPropertyList;
+ /// If the context is a direct child of XMLBodyContentContext.
+ /// Only direct child of XMLBodyContentContext has to handle page span.
+ bool m_bTopLevel;
+};
+
+/// Shared child context factory for paragraph and span contexts.
+rtl::Reference<XMLImportContext>
+CreateParagraphOrSpanChildContext(XMLImport& rImport, const OUString& rName,
+ const librevenge::RVNGPropertyList& rTextPropertyList);
+
+/// Looks for rName in rAutomaticStyles (and failing that, in rNamedStyles) and
+/// fills rPropertyList based on that.
+void FillStyles(const OUString& rName,
+ std::map<OUString, librevenge::RVNGPropertyList>& rAutomaticStyles,
+ std::map<OUString, librevenge::RVNGPropertyList>& rNamedStyles,
+ librevenge::RVNGPropertyList& rPropertyList);
+
+} // namespace exp
+} // namespace writerperfect
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/txtstyli.cxx b/writerperfect/source/writer/exp/txtstyli.cxx
new file mode 100644
index 000000000..53ac4b4e5
--- /dev/null
+++ b/writerperfect/source/writer/exp/txtstyli.cxx
@@ -0,0 +1,415 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "txtstyli.hxx"
+
+#include "xmlfmt.hxx"
+
+using namespace com::sun::star;
+
+namespace writerperfect::exp
+{
+namespace
+{
+/// Handler for <style:paragraph-properties>.
+class XMLParagraphPropertiesContext : public XMLImportContext
+{
+public:
+ XMLParagraphPropertiesContext(XMLImport& rImport, XMLStyleContext& rStyle);
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+private:
+ XMLStyleContext& mrStyle;
+};
+}
+
+XMLParagraphPropertiesContext::XMLParagraphPropertiesContext(XMLImport& rImport,
+ XMLStyleContext& rStyle)
+ : XMLImportContext(rImport)
+ , mrStyle(rStyle)
+{
+}
+
+void XMLParagraphPropertiesContext::startElement(
+ const OUString& /*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
+{
+ for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
+ {
+ OString sName = OUStringToOString(xAttribs->getNameByIndex(i), RTL_TEXTENCODING_UTF8);
+ OString sValue = OUStringToOString(xAttribs->getValueByIndex(i), RTL_TEXTENCODING_UTF8);
+ mrStyle.GetParagraphPropertyList().insert(sName.getStr(), sValue.getStr());
+ }
+}
+
+namespace
+{
+/// Handler for <style:text-properties>.
+class XMLTextPropertiesContext : public XMLImportContext
+{
+public:
+ XMLTextPropertiesContext(XMLImport& rImport, XMLStyleContext& rStyle);
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+private:
+ XMLStyleContext& mrStyle;
+};
+}
+
+XMLTextPropertiesContext::XMLTextPropertiesContext(XMLImport& rImport, XMLStyleContext& rStyle)
+ : XMLImportContext(rImport)
+ , mrStyle(rStyle)
+{
+}
+
+void XMLTextPropertiesContext::startElement(
+ const OUString& /*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
+{
+ for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
+ {
+ OString sName = OUStringToOString(xAttribs->getNameByIndex(i), RTL_TEXTENCODING_UTF8);
+ OString sValue = OUStringToOString(xAttribs->getValueByIndex(i), RTL_TEXTENCODING_UTF8);
+ mrStyle.GetTextPropertyList().insert(sName.getStr(), sValue.getStr());
+ }
+}
+
+namespace
+{
+/// Handler for <style:graphic-properties>.
+class XMLGraphicPropertiesContext : public XMLImportContext
+{
+public:
+ XMLGraphicPropertiesContext(XMLImport& rImport, XMLStyleContext& rStyle);
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+private:
+ XMLStyleContext& mrStyle;
+};
+}
+
+XMLGraphicPropertiesContext::XMLGraphicPropertiesContext(XMLImport& rImport,
+ XMLStyleContext& rStyle)
+ : XMLImportContext(rImport)
+ , mrStyle(rStyle)
+{
+}
+
+void XMLGraphicPropertiesContext::startElement(
+ const OUString& /*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
+{
+ for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
+ {
+ OString sName = OUStringToOString(xAttribs->getNameByIndex(i), RTL_TEXTENCODING_UTF8);
+ OString sValue = OUStringToOString(xAttribs->getValueByIndex(i), RTL_TEXTENCODING_UTF8);
+ mrStyle.GetGraphicPropertyList().insert(sName.getStr(), sValue.getStr());
+ }
+}
+
+namespace
+{
+/// Handler for <style:page-layout-properties>.
+class XMLPageLayoutPropertiesContext : public XMLImportContext
+{
+public:
+ XMLPageLayoutPropertiesContext(XMLImport& rImport, XMLStyleContext& rStyle);
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+private:
+ XMLStyleContext& mrStyle;
+};
+}
+
+XMLPageLayoutPropertiesContext::XMLPageLayoutPropertiesContext(XMLImport& rImport,
+ XMLStyleContext& rStyle)
+ : XMLImportContext(rImport)
+ , mrStyle(rStyle)
+{
+}
+
+void XMLPageLayoutPropertiesContext::startElement(
+ const OUString& /*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
+{
+ for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
+ {
+ OString sName = OUStringToOString(xAttribs->getNameByIndex(i), RTL_TEXTENCODING_UTF8);
+ OString sValue = OUStringToOString(xAttribs->getValueByIndex(i), RTL_TEXTENCODING_UTF8);
+ // We only care about writing-mode for now.
+ if (sName != "style:writing-mode")
+ continue;
+
+ mrStyle.GetPageLayoutPropertyList().insert(sName.getStr(), sValue.getStr());
+ }
+}
+
+namespace
+{
+/// Handler for <style:table-properties>.
+class XMLTablePropertiesContext : public XMLImportContext
+{
+public:
+ XMLTablePropertiesContext(XMLImport& rImport, XMLStyleContext& rStyle);
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+private:
+ XMLStyleContext& mrStyle;
+};
+}
+
+XMLTablePropertiesContext::XMLTablePropertiesContext(XMLImport& rImport, XMLStyleContext& rStyle)
+ : XMLImportContext(rImport)
+ , mrStyle(rStyle)
+{
+}
+
+void XMLTablePropertiesContext::startElement(
+ const OUString& /*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
+{
+ for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
+ {
+ OString sName = OUStringToOString(xAttribs->getNameByIndex(i), RTL_TEXTENCODING_UTF8);
+ OString sValue = OUStringToOString(xAttribs->getValueByIndex(i), RTL_TEXTENCODING_UTF8);
+ if (sName == "style:rel-width")
+ // Make sure this is passed through as a string, and not parsed as a double.
+ mrStyle.GetTablePropertyList().insert(
+ sName.getStr(), librevenge::RVNGPropertyFactory::newStringProp(sValue.getStr()));
+ else
+ mrStyle.GetTablePropertyList().insert(sName.getStr(), sValue.getStr());
+ }
+}
+
+namespace
+{
+/// Handler for <style:table-row-properties>.
+class XMLTableRowPropertiesContext : public XMLImportContext
+{
+public:
+ XMLTableRowPropertiesContext(XMLImport& rImport, XMLStyleContext& rStyle);
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+private:
+ XMLStyleContext& mrStyle;
+};
+}
+
+XMLTableRowPropertiesContext::XMLTableRowPropertiesContext(XMLImport& rImport,
+ XMLStyleContext& rStyle)
+ : XMLImportContext(rImport)
+ , mrStyle(rStyle)
+{
+}
+
+void XMLTableRowPropertiesContext::startElement(
+ const OUString& /*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
+{
+ for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
+ {
+ OString sName = OUStringToOString(xAttribs->getNameByIndex(i), RTL_TEXTENCODING_UTF8);
+ OString sValue = OUStringToOString(xAttribs->getValueByIndex(i), RTL_TEXTENCODING_UTF8);
+ mrStyle.GetRowPropertyList().insert(sName.getStr(), sValue.getStr());
+ }
+}
+
+namespace
+{
+/// Handler for <style:table-column-properties>.
+class XMLTableColumnPropertiesContext : public XMLImportContext
+{
+public:
+ XMLTableColumnPropertiesContext(XMLImport& rImport, XMLStyleContext& rStyle);
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+private:
+ XMLStyleContext& mrStyle;
+};
+}
+
+XMLTableColumnPropertiesContext::XMLTableColumnPropertiesContext(XMLImport& rImport,
+ XMLStyleContext& rStyle)
+ : XMLImportContext(rImport)
+ , mrStyle(rStyle)
+{
+}
+
+void XMLTableColumnPropertiesContext::startElement(
+ const OUString& /*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
+{
+ for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
+ {
+ OString sName = OUStringToOString(xAttribs->getNameByIndex(i), RTL_TEXTENCODING_UTF8);
+ OString sValue = OUStringToOString(xAttribs->getValueByIndex(i), RTL_TEXTENCODING_UTF8);
+ mrStyle.GetColumnPropertyList().insert(sName.getStr(), sValue.getStr());
+ }
+}
+
+namespace
+{
+/// Handler for <style:table-cell-properties>.
+class XMLTableCellPropertiesContext : public XMLImportContext
+{
+public:
+ XMLTableCellPropertiesContext(XMLImport& rImport, XMLStyleContext& rStyle);
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+private:
+ XMLStyleContext& mrStyle;
+};
+}
+
+XMLTableCellPropertiesContext::XMLTableCellPropertiesContext(XMLImport& rImport,
+ XMLStyleContext& rStyle)
+ : XMLImportContext(rImport)
+ , mrStyle(rStyle)
+{
+}
+
+void XMLTableCellPropertiesContext::startElement(
+ const OUString& /*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
+{
+ for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
+ {
+ OString sName = OUStringToOString(xAttribs->getNameByIndex(i), RTL_TEXTENCODING_UTF8);
+ OString sValue = OUStringToOString(xAttribs->getValueByIndex(i), RTL_TEXTENCODING_UTF8);
+ mrStyle.GetCellPropertyList().insert(sName.getStr(), sValue.getStr());
+ }
+}
+
+XMLStyleContext::XMLStyleContext(XMLImport& rImport, XMLStylesContext& rStyles)
+ : XMLImportContext(rImport)
+ , m_rStyles(rStyles)
+{
+}
+
+rtl::Reference<XMLImportContext> XMLStyleContext::CreateChildContext(
+ const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ if (rName == "style:paragraph-properties")
+ return new XMLParagraphPropertiesContext(GetImport(), *this);
+ if (rName == "style:text-properties")
+ return new XMLTextPropertiesContext(GetImport(), *this);
+ if (rName == "style:table-cell-properties")
+ return new XMLTableCellPropertiesContext(GetImport(), *this);
+ if (rName == "style:table-column-properties")
+ return new XMLTableColumnPropertiesContext(GetImport(), *this);
+ if (rName == "style:table-row-properties")
+ return new XMLTableRowPropertiesContext(GetImport(), *this);
+ if (rName == "style:table-properties")
+ return new XMLTablePropertiesContext(GetImport(), *this);
+ if (rName == "style:graphic-properties")
+ return new XMLGraphicPropertiesContext(GetImport(), *this);
+ if (rName == "style:page-layout-properties")
+ return new XMLPageLayoutPropertiesContext(GetImport(), *this);
+ return nullptr;
+}
+
+void XMLStyleContext::startElement(
+ const OUString& /*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
+{
+ for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
+ {
+ const OUString& rAttributeName = xAttribs->getNameByIndex(i);
+ const OUString& rAttributeValue = xAttribs->getValueByIndex(i);
+ if (rAttributeName == "style:name")
+ m_aName = rAttributeValue;
+ else if (rAttributeName == "style:family")
+ m_aFamily = rAttributeValue;
+
+ // Remember properties of the style itself, e.g. parent name.
+ OString sName = OUStringToOString(rAttributeName, RTL_TEXTENCODING_UTF8);
+ OString sValue = OUStringToOString(rAttributeValue, RTL_TEXTENCODING_UTF8);
+ m_aTextPropertyList.insert(sName.getStr(), sValue.getStr());
+ m_aParagraphPropertyList.insert(sName.getStr(), sValue.getStr());
+ m_aGraphicPropertyList.insert(sName.getStr(), sValue.getStr());
+ m_aPageLayoutPropertyList.insert(sName.getStr(), sValue.getStr());
+ m_aMasterPagePropertyList.insert(sName.getStr(), sValue.getStr());
+ m_aTablePropertyList.insert(sName.getStr(), sValue.getStr());
+ }
+}
+
+void XMLStyleContext::endElement(const OUString& rName)
+{
+ if (m_aName.isEmpty())
+ return;
+
+ if (m_aFamily == "text" || m_aFamily == "paragraph")
+ m_rStyles.GetCurrentTextStyles()[m_aName] = m_aTextPropertyList;
+ if (m_aFamily == "paragraph")
+ m_rStyles.GetCurrentParagraphStyles()[m_aName] = m_aParagraphPropertyList;
+ else if (m_aFamily == "table-cell")
+ m_rStyles.GetCurrentCellStyles()[m_aName] = m_aCellPropertyList;
+ else if (m_aFamily == "table-column")
+ m_rStyles.GetCurrentColumnStyles()[m_aName] = m_aColumnPropertyList;
+ else if (m_aFamily == "table-row")
+ m_rStyles.GetCurrentRowStyles()[m_aName] = m_aRowPropertyList;
+ else if (m_aFamily == "table")
+ m_rStyles.GetCurrentTableStyles()[m_aName] = m_aTablePropertyList;
+ else if (m_aFamily == "graphic")
+ m_rStyles.GetCurrentGraphicStyles()[m_aName] = m_aGraphicPropertyList;
+ else if (rName == "style:page-layout")
+ m_rStyles.GetCurrentPageLayouts()[m_aName] = m_aPageLayoutPropertyList;
+ else if (rName == "style:master-page")
+ m_rStyles.GetCurrentMasterStyles()[m_aName] = m_aMasterPagePropertyList;
+}
+
+librevenge::RVNGPropertyList& XMLStyleContext::GetTextPropertyList() { return m_aTextPropertyList; }
+
+librevenge::RVNGPropertyList& XMLStyleContext::GetParagraphPropertyList()
+{
+ return m_aParagraphPropertyList;
+}
+
+librevenge::RVNGPropertyList& XMLStyleContext::GetCellPropertyList() { return m_aCellPropertyList; }
+
+librevenge::RVNGPropertyList& XMLStyleContext::GetColumnPropertyList()
+{
+ return m_aColumnPropertyList;
+}
+
+librevenge::RVNGPropertyList& XMLStyleContext::GetRowPropertyList() { return m_aRowPropertyList; }
+
+librevenge::RVNGPropertyList& XMLStyleContext::GetTablePropertyList()
+{
+ return m_aTablePropertyList;
+}
+
+librevenge::RVNGPropertyList& XMLStyleContext::GetGraphicPropertyList()
+{
+ return m_aGraphicPropertyList;
+}
+
+librevenge::RVNGPropertyList& XMLStyleContext::GetPageLayoutPropertyList()
+{
+ return m_aPageLayoutPropertyList;
+}
+
+} // namespace writerperfect::exp
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/txtstyli.hxx b/writerperfect/source/writer/exp/txtstyli.hxx
new file mode 100644
index 000000000..c4ddc4888
--- /dev/null
+++ b/writerperfect/source/writer/exp/txtstyli.hxx
@@ -0,0 +1,66 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_TXTSTYLI_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_TXTSTYLI_HXX
+
+#include <librevenge/librevenge.h>
+
+#include "xmlictxt.hxx"
+
+namespace writerperfect
+{
+namespace exp
+{
+class XMLStylesContext;
+
+/// Handler for <style:style>.
+class XMLStyleContext : public XMLImportContext
+{
+public:
+ XMLStyleContext(XMLImport& rImport, XMLStylesContext& rStyles);
+
+ rtl::Reference<XMLImportContext>
+ CreateChildContext(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+ void SAL_CALL endElement(const OUString& rName) override;
+
+ librevenge::RVNGPropertyList& GetTextPropertyList();
+ librevenge::RVNGPropertyList& GetParagraphPropertyList();
+ librevenge::RVNGPropertyList& GetCellPropertyList();
+ librevenge::RVNGPropertyList& GetColumnPropertyList();
+ librevenge::RVNGPropertyList& GetRowPropertyList();
+ librevenge::RVNGPropertyList& GetTablePropertyList();
+ librevenge::RVNGPropertyList& GetGraphicPropertyList();
+ librevenge::RVNGPropertyList& GetPageLayoutPropertyList();
+
+private:
+ OUString m_aName;
+ OUString m_aFamily;
+ librevenge::RVNGPropertyList m_aTextPropertyList;
+ librevenge::RVNGPropertyList m_aParagraphPropertyList;
+ librevenge::RVNGPropertyList m_aCellPropertyList;
+ librevenge::RVNGPropertyList m_aColumnPropertyList;
+ librevenge::RVNGPropertyList m_aRowPropertyList;
+ librevenge::RVNGPropertyList m_aTablePropertyList;
+ librevenge::RVNGPropertyList m_aGraphicPropertyList;
+ librevenge::RVNGPropertyList m_aPageLayoutPropertyList;
+ librevenge::RVNGPropertyList m_aMasterPagePropertyList;
+ XMLStylesContext& m_rStyles;
+};
+
+} // namespace exp
+} // namespace writerperfect
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/xmlfmt.cxx b/writerperfect/source/writer/exp/xmlfmt.cxx
new file mode 100644
index 000000000..f34540ddd
--- /dev/null
+++ b/writerperfect/source/writer/exp/xmlfmt.cxx
@@ -0,0 +1,295 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xmlfmt.hxx"
+
+#include "XMLBase64ImportContext.hxx"
+#include "txtstyli.hxx"
+#include "xmlimp.hxx"
+
+#include <sal/log.hxx>
+
+using namespace com::sun::star;
+
+namespace writerperfect::exp
+{
+XMLStylesContext::XMLStylesContext(XMLImport& rImport, StyleType eType)
+ : XMLImportContext(rImport)
+ , m_rParagraphStyles(eType == StyleType_AUTOMATIC ? GetImport().GetAutomaticParagraphStyles()
+ : GetImport().GetParagraphStyles())
+ , m_rTextStyles(eType == StyleType_AUTOMATIC ? GetImport().GetAutomaticTextStyles()
+ : GetImport().GetTextStyles())
+ , m_rCellStyles(eType == StyleType_AUTOMATIC ? GetImport().GetAutomaticCellStyles()
+ : GetImport().GetCellStyles())
+ , m_rColumnStyles(eType == StyleType_AUTOMATIC ? GetImport().GetAutomaticColumnStyles()
+ : GetImport().GetColumnStyles())
+ , m_rRowStyles(eType == StyleType_AUTOMATIC ? GetImport().GetAutomaticRowStyles()
+ : GetImport().GetRowStyles())
+ , m_rTableStyles(eType == StyleType_AUTOMATIC ? GetImport().GetAutomaticTableStyles()
+ : GetImport().GetTableStyles())
+ , m_rGraphicStyles(eType == StyleType_AUTOMATIC ? GetImport().GetAutomaticGraphicStyles()
+ : GetImport().GetGraphicStyles())
+ , m_rPageLayouts(GetImport().GetPageLayouts())
+ , m_rMasterStyles(GetImport().GetMasterStyles())
+{
+}
+
+rtl::Reference<XMLImportContext> XMLStylesContext::CreateChildContext(
+ const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ if (rName == "style:style" || rName == "style:page-layout" || rName == "style:master-page")
+ return new XMLStyleContext(GetImport(), *this);
+ return nullptr;
+}
+
+std::map<OUString, librevenge::RVNGPropertyList>& XMLStylesContext::GetCurrentParagraphStyles()
+{
+ return m_rParagraphStyles;
+}
+
+std::map<OUString, librevenge::RVNGPropertyList>& XMLStylesContext::GetCurrentTextStyles()
+{
+ return m_rTextStyles;
+}
+
+std::map<OUString, librevenge::RVNGPropertyList>& XMLStylesContext::GetCurrentCellStyles()
+{
+ return m_rCellStyles;
+}
+
+std::map<OUString, librevenge::RVNGPropertyList>& XMLStylesContext::GetCurrentColumnStyles()
+{
+ return m_rColumnStyles;
+}
+
+std::map<OUString, librevenge::RVNGPropertyList>& XMLStylesContext::GetCurrentRowStyles()
+{
+ return m_rRowStyles;
+}
+
+std::map<OUString, librevenge::RVNGPropertyList>& XMLStylesContext::GetCurrentTableStyles()
+{
+ return m_rTableStyles;
+}
+
+std::map<OUString, librevenge::RVNGPropertyList>& XMLStylesContext::GetCurrentGraphicStyles()
+{
+ return m_rGraphicStyles;
+}
+
+std::map<OUString, librevenge::RVNGPropertyList>& XMLStylesContext::GetCurrentPageLayouts()
+{
+ return m_rPageLayouts;
+}
+
+std::map<OUString, librevenge::RVNGPropertyList>& XMLStylesContext::GetCurrentMasterStyles()
+{
+ return m_rMasterStyles;
+}
+
+namespace
+{
+/// Handler for <style:font-face>.
+class XMLFontFaceContext : public XMLImportContext
+{
+public:
+ XMLFontFaceContext(XMLImport& rImport);
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+ rtl::Reference<XMLImportContext>
+ CreateChildContext(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+ OUString const& GetName() const { return maName; }
+
+private:
+ OUString maName;
+};
+
+/// Handler for <svg:font-face-src>.
+class XMLFontFaceSrcContext : public XMLImportContext
+{
+public:
+ XMLFontFaceSrcContext(XMLImport& rImport, XMLFontFaceContext& rFontFace);
+
+ rtl::Reference<XMLImportContext>
+ CreateChildContext(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+private:
+ XMLFontFaceContext& mrFontFace;
+};
+
+/// Handler for <svg:font-face-uri>.
+class XMLFontFaceUriContext : public XMLImportContext
+{
+public:
+ XMLFontFaceUriContext(XMLImport& rImport, XMLFontFaceContext const& rFontFace);
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+ void SAL_CALL endElement(const OUString& rName) override;
+
+ rtl::Reference<XMLImportContext>
+ CreateChildContext(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+ librevenge::RVNGPropertyList& GetPropertyList() { return maPropertyList; }
+
+private:
+ librevenge::RVNGPropertyList maPropertyList;
+ rtl::Reference<XMLBase64ImportContext> mxBinaryData;
+};
+
+/// Handler for <svg:font-face-format>.
+class XMLFontFaceFormatContext : public XMLImportContext
+{
+public:
+ XMLFontFaceFormatContext(XMLImport& rImport, XMLFontFaceUriContext& rFontFaceUri);
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+private:
+ XMLFontFaceUriContext& mrFontFaceUri;
+};
+}
+
+XMLFontFaceFormatContext::XMLFontFaceFormatContext(XMLImport& rImport,
+ XMLFontFaceUriContext& rFontFaceUri)
+ : XMLImportContext(rImport)
+ , mrFontFaceUri(rFontFaceUri)
+{
+}
+
+void XMLFontFaceFormatContext::startElement(
+ const OUString& /*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
+{
+ for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
+ {
+ const OUString& rAttributeName = xAttribs->getNameByIndex(i);
+ const OUString& rAttributeValue = xAttribs->getValueByIndex(i);
+ if (rAttributeName == "svg:string")
+ {
+ OString aAttributeValueU8 = OUStringToOString(rAttributeValue, RTL_TEXTENCODING_UTF8);
+ mrFontFaceUri.GetPropertyList().insert("librevenge:mime-type",
+ aAttributeValueU8.getStr());
+ }
+ }
+}
+
+XMLFontFaceUriContext::XMLFontFaceUriContext(XMLImport& rImport,
+ XMLFontFaceContext const& rFontFace)
+ : XMLImportContext(rImport)
+{
+ OString aNameU8 = OUStringToOString(rFontFace.GetName(), RTL_TEXTENCODING_UTF8);
+ maPropertyList.insert("librevenge:name", aNameU8.getStr());
+}
+
+void XMLFontFaceUriContext::startElement(
+ const OUString& /*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
+{
+ for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
+ {
+ const OUString& rAttributeName = xAttribs->getNameByIndex(i);
+ const OUString& rAttributeValue = xAttribs->getValueByIndex(i);
+ if (rAttributeName == "loext:font-style")
+ {
+ OString aAttributeValueU8 = OUStringToOString(rAttributeValue, RTL_TEXTENCODING_UTF8);
+ maPropertyList.insert("librevenge:font-style", aAttributeValueU8.getStr());
+ }
+ else if (rAttributeName == "loext:font-weight")
+ {
+ OString aAttributeValueU8 = OUStringToOString(rAttributeValue, RTL_TEXTENCODING_UTF8);
+ maPropertyList.insert("librevenge:font-weight", aAttributeValueU8.getStr());
+ }
+ }
+}
+
+void XMLFontFaceUriContext::endElement(const OUString& /*rName*/)
+{
+ if (mxBinaryData.is())
+ maPropertyList.insert("office:binary-data", mxBinaryData->getBinaryData());
+ GetImport().GetGenerator().defineEmbeddedFont(maPropertyList);
+}
+
+rtl::Reference<XMLImportContext> XMLFontFaceUriContext::CreateChildContext(
+ const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ if (rName == "office:binary-data")
+ {
+ mxBinaryData = new XMLBase64ImportContext(GetImport());
+ return mxBinaryData.get();
+ }
+ if (rName == "svg:font-face-format")
+ return new XMLFontFaceFormatContext(GetImport(), *this);
+
+ SAL_WARN("writerperfect", "XMLFontFaceUriContext::CreateChildContext: unhandled " << rName);
+ return nullptr;
+}
+
+XMLFontFaceSrcContext::XMLFontFaceSrcContext(XMLImport& rImport, XMLFontFaceContext& rFontFace)
+ : XMLImportContext(rImport)
+ , mrFontFace(rFontFace)
+{
+}
+
+rtl::Reference<XMLImportContext> XMLFontFaceSrcContext::CreateChildContext(
+ const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ if (rName == "svg:font-face-uri")
+ return new XMLFontFaceUriContext(GetImport(), mrFontFace);
+ SAL_WARN("writerperfect", "XMLFontFaceSrcContext::CreateChildContext: unhandled " << rName);
+ return nullptr;
+}
+
+XMLFontFaceContext::XMLFontFaceContext(XMLImport& rImport)
+ : XMLImportContext(rImport)
+{
+}
+
+void XMLFontFaceContext::startElement(
+ const OUString& /*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
+{
+ for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
+ {
+ const OUString& rAttributeName = xAttribs->getNameByIndex(i);
+ const OUString& rAttributeValue = xAttribs->getValueByIndex(i);
+ if (rAttributeName == "style:name")
+ maName = rAttributeValue;
+ }
+}
+
+rtl::Reference<XMLImportContext> XMLFontFaceContext::CreateChildContext(
+ const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ if (rName == "svg:font-face-src")
+ return new XMLFontFaceSrcContext(GetImport(), *this);
+ SAL_WARN("writerperfect", "XMLFontFaceContext::CreateChildContext: unhandled " << rName);
+ return nullptr;
+}
+
+XMLFontFaceDeclsContext::XMLFontFaceDeclsContext(XMLImport& rImport)
+ : XMLImportContext(rImport)
+{
+}
+
+rtl::Reference<XMLImportContext> XMLFontFaceDeclsContext::CreateChildContext(
+ const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ if (rName == "style:font-face")
+ return new XMLFontFaceContext(GetImport());
+ return nullptr;
+}
+
+} // namespace writerperfect::exp
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/xmlfmt.hxx b/writerperfect/source/writer/exp/xmlfmt.hxx
new file mode 100644
index 000000000..6f3211de2
--- /dev/null
+++ b/writerperfect/source/writer/exp/xmlfmt.hxx
@@ -0,0 +1,79 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLFMT_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLFMT_HXX
+
+#include <map>
+
+#include "xmlictxt.hxx"
+
+namespace librevenge
+{
+class RVNGPropertyList;
+}
+
+namespace writerperfect
+{
+namespace exp
+{
+/// Handler for <office:automatic-styles>/<office:styles>.
+class XMLStylesContext : public XMLImportContext
+{
+public:
+ enum StyleType
+ {
+ StyleType_NONE,
+ StyleType_AUTOMATIC
+ };
+ XMLStylesContext(XMLImport& rImport, StyleType eType);
+
+ rtl::Reference<XMLImportContext>
+ CreateChildContext(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+ std::map<OUString, librevenge::RVNGPropertyList>& GetCurrentParagraphStyles();
+ std::map<OUString, librevenge::RVNGPropertyList>& GetCurrentTextStyles();
+ std::map<OUString, librevenge::RVNGPropertyList>& GetCurrentCellStyles();
+ std::map<OUString, librevenge::RVNGPropertyList>& GetCurrentColumnStyles();
+ std::map<OUString, librevenge::RVNGPropertyList>& GetCurrentRowStyles();
+ std::map<OUString, librevenge::RVNGPropertyList>& GetCurrentTableStyles();
+ std::map<OUString, librevenge::RVNGPropertyList>& GetCurrentGraphicStyles();
+ std::map<OUString, librevenge::RVNGPropertyList>& GetCurrentPageLayouts();
+ std::map<OUString, librevenge::RVNGPropertyList>& GetCurrentMasterStyles();
+
+private:
+ std::map<OUString, librevenge::RVNGPropertyList>& m_rParagraphStyles;
+ std::map<OUString, librevenge::RVNGPropertyList>& m_rTextStyles;
+ std::map<OUString, librevenge::RVNGPropertyList>& m_rCellStyles;
+ std::map<OUString, librevenge::RVNGPropertyList>& m_rColumnStyles;
+ std::map<OUString, librevenge::RVNGPropertyList>& m_rRowStyles;
+ std::map<OUString, librevenge::RVNGPropertyList>& m_rTableStyles;
+ std::map<OUString, librevenge::RVNGPropertyList>& m_rGraphicStyles;
+ std::map<OUString, librevenge::RVNGPropertyList>& m_rPageLayouts;
+ std::map<OUString, librevenge::RVNGPropertyList>& m_rMasterStyles;
+};
+
+/// Handler for <office:font-face-decls>.
+class XMLFontFaceDeclsContext : public XMLImportContext
+{
+public:
+ XMLFontFaceDeclsContext(XMLImport& rImport);
+
+ rtl::Reference<XMLImportContext>
+ CreateChildContext(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+};
+
+} // namespace exp
+} // namespace writerperfect
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/xmlictxt.cxx b/writerperfect/source/writer/exp/xmlictxt.cxx
new file mode 100644
index 000000000..ebfe58402
--- /dev/null
+++ b/writerperfect/source/writer/exp/xmlictxt.cxx
@@ -0,0 +1,56 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xmlictxt.hxx"
+
+#include "xmlimp.hxx"
+
+using namespace com::sun::star;
+
+namespace writerperfect::exp
+{
+XMLImportContext::XMLImportContext(XMLImport& rImport)
+ : mrImport(rImport)
+{
+}
+
+rtl::Reference<XMLImportContext> XMLImportContext::CreateChildContext(
+ const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
+{
+ return mrImport.CreateContext(rName, xAttribs);
+}
+
+void XMLImportContext::startDocument() {}
+
+void XMLImportContext::endDocument() {}
+
+void XMLImportContext::startElement(
+ const OUString& /*rName*/,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+}
+
+void XMLImportContext::endElement(const OUString& /*rName*/) {}
+
+void XMLImportContext::characters(const OUString& /*rChars*/) {}
+
+void XMLImportContext::ignorableWhitespace(const OUString& /*rWhitespaces*/) {}
+
+void XMLImportContext::processingInstruction(const OUString& /*rTarget*/, const OUString& /*rData*/)
+{
+}
+
+void XMLImportContext::setDocumentLocator(
+ const css::uno::Reference<css::xml::sax::XLocator>& /*xLocator*/)
+{
+}
+
+} // namespace writerperfect::exp
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/xmlictxt.hxx b/writerperfect/source/writer/exp/xmlictxt.hxx
new file mode 100644
index 000000000..a0ea42bc6
--- /dev/null
+++ b/writerperfect/source/writer/exp/xmlictxt.hxx
@@ -0,0 +1,57 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLICTXT_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLICTXT_HXX
+
+#include <com/sun/star/xml/sax/XDocumentHandler.hpp>
+
+#include <cppuhelper/implbase.hxx>
+#include <rtl/ref.hxx>
+
+namespace writerperfect
+{
+namespace exp
+{
+class XMLImport;
+
+/// Base class for a handler of a single XML element during ODF -> librevenge conversion.
+class XMLImportContext : public cppu::WeakImplHelper<css::xml::sax::XDocumentHandler>
+{
+public:
+ XMLImportContext(XMLImport& rImport);
+ XMLImport& GetImport() { return mrImport; }
+
+ virtual rtl::Reference<XMLImportContext>
+ CreateChildContext(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs);
+
+ // XDocumentHandler
+ void SAL_CALL startDocument() override;
+ void SAL_CALL endDocument() override;
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+ void SAL_CALL endElement(const OUString& rName) override;
+ void SAL_CALL characters(const OUString& rChars) override;
+ void SAL_CALL ignorableWhitespace(const OUString& rWhitespaces) override;
+ void SAL_CALL processingInstruction(const OUString& rTarget, const OUString& rData) override;
+ void SAL_CALL
+ setDocumentLocator(const css::uno::Reference<css::xml::sax::XLocator>& xLocator) override;
+
+private:
+ XMLImport& mrImport;
+};
+
+} // namespace exp
+} // namespace writerperfect
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/xmlimp.cxx b/writerperfect/source/writer/exp/xmlimp.cxx
new file mode 100644
index 000000000..9ade95990
--- /dev/null
+++ b/writerperfect/source/writer/exp/xmlimp.cxx
@@ -0,0 +1,617 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xmlimp.hxx"
+
+#include <initializer_list>
+#include <unordered_map>
+
+#include <com/sun/star/svg/XSVGWriter.hpp>
+#include <com/sun/star/uri/UriReferenceFactory.hpp>
+#include <com/sun/star/xml/sax/InputSource.hpp>
+#include <com/sun/star/xml/sax/Parser.hpp>
+#include <com/sun/star/xml/sax/Writer.hpp>
+#include <comphelper/propertyvalue.hxx>
+#include <rtl/uri.hxx>
+#include <tools/gen.hxx>
+#include <tools/stream.hxx>
+#include <tools/urlobj.hxx>
+#include <unotools/streamwrap.hxx>
+#include <tools/diagnose_ex.h>
+
+#include "xmlfmt.hxx"
+#include "xmlictxt.hxx"
+#include "xmlmetai.hxx"
+#include "xmltext.hxx"
+
+using namespace com::sun::star;
+
+namespace writerperfect::exp
+{
+namespace
+{
+/// Looks up mime type for a given image extension.
+OUString GetMimeType(const OUString& rExtension)
+{
+ static const std::unordered_map<OUString, OUString> vMimeTypes = {
+ { "gif", "image/gif" },
+ { "jpg", "image/jpeg" },
+ { "png", "image/png" },
+ { "svg", "image/svg+xml" },
+ };
+
+ auto it = vMimeTypes.find(rExtension);
+ return it == vMimeTypes.end() ? OUString() : it->second;
+}
+
+/// Determines the base directory for cover images, XMP metadata, popup images.
+OUString FindMediaDir(const OUString& rDocumentBaseURL,
+ const uno::Sequence<beans::PropertyValue>& rFilterData)
+{
+ OUString aMediaDir;
+
+ // See if filter data contains a media directory explicitly.
+ auto pProp = std::find_if(
+ rFilterData.begin(), rFilterData.end(),
+ [](const beans::PropertyValue& rProp) { return rProp.Name == "RVNGMediaDir"; });
+ if (pProp != rFilterData.end())
+ pProp->Value >>= aMediaDir;
+
+ if (!aMediaDir.isEmpty())
+ return aMediaDir + "/";
+
+ // Not set explicitly, try to pick it up from the base directory.
+ INetURLObject aURL(rDocumentBaseURL);
+ try
+ {
+ aMediaDir = rtl::Uri::convertRelToAbs(rDocumentBaseURL, aURL.GetBase()) + "/";
+ }
+ catch (const rtl::MalformedUriException&)
+ {
+ DBG_UNHANDLED_EXCEPTION("writerperfect");
+ }
+ return aMediaDir;
+}
+
+/// Picks up a cover image from the base directory.
+OUString FindCoverImage(const OUString& rDocumentBaseURL, OUString& rMimeType,
+ const uno::Sequence<beans::PropertyValue>& rFilterData)
+{
+ OUString aRet;
+
+ // See if filter data contains a cover image explicitly.
+ auto pProp = std::find_if(
+ rFilterData.begin(), rFilterData.end(),
+ [](const beans::PropertyValue& rProp) { return rProp.Name == "RVNGCoverImage"; });
+ if (pProp != rFilterData.end())
+ pProp->Value >>= aRet;
+
+ if (!aRet.isEmpty())
+ {
+ INetURLObject aRetURL(aRet);
+ rMimeType = GetMimeType(aRetURL.GetFileExtension());
+ return aRet;
+ }
+
+ // Not set explicitly, try to pick it up from the base directory.
+ if (rDocumentBaseURL.isEmpty())
+ return aRet;
+
+ static const std::initializer_list<OUStringLiteral> vExtensions
+ = { "gif", "jpg", "png", "svg" };
+
+ OUString aMediaDir = FindMediaDir(rDocumentBaseURL, rFilterData);
+ for (const auto& rExtension : vExtensions)
+ {
+ aRet = aMediaDir + "cover." + rExtension;
+ if (!aRet.isEmpty())
+ {
+ SvFileStream aStream(aRet, StreamMode::READ);
+ if (aStream.IsOpen())
+ {
+ rMimeType = GetMimeType(rExtension);
+ // File exists.
+ return aRet;
+ }
+
+ aRet.clear();
+ }
+ }
+
+ return aRet;
+}
+
+/// Picks up XMP metadata from the base directory.
+void FindXMPMetadata(const uno::Reference<uno::XComponentContext>& xContext,
+ const OUString& rDocumentBaseURL,
+ const uno::Sequence<beans::PropertyValue>& rFilterData,
+ librevenge::RVNGPropertyList& rMetaData)
+{
+ // See if filter data contains metadata explicitly.
+ OUString aValue;
+ for (const auto& rProp : rFilterData)
+ {
+ if (rProp.Name == "RVNGIdentifier")
+ {
+ rProp.Value >>= aValue;
+ if (!aValue.isEmpty())
+ rMetaData.insert("dc:identifier", aValue.toUtf8().getStr());
+ }
+ else if (rProp.Name == "RVNGTitle")
+ {
+ rProp.Value >>= aValue;
+ if (!aValue.isEmpty())
+ rMetaData.insert("dc:title", aValue.toUtf8().getStr());
+ }
+ else if (rProp.Name == "RVNGInitialCreator")
+ {
+ rProp.Value >>= aValue;
+ if (!aValue.isEmpty())
+ rMetaData.insert("meta:initial-creator", aValue.toUtf8().getStr());
+ }
+ else if (rProp.Name == "RVNGLanguage")
+ {
+ rProp.Value >>= aValue;
+ if (!aValue.isEmpty())
+ rMetaData.insert("dc:language", aValue.toUtf8().getStr());
+ }
+ else if (rProp.Name == "RVNGDate")
+ {
+ rProp.Value >>= aValue;
+ if (!aValue.isEmpty())
+ rMetaData.insert("dc:date", aValue.toUtf8().getStr());
+ }
+ }
+
+ // If not set explicitly, try to pick it up from the base directory.
+ if (rDocumentBaseURL.isEmpty())
+ return;
+
+ OUString aMediaDir = FindMediaDir(rDocumentBaseURL, rFilterData);
+ OUString aURL = aMediaDir + "metadata.xmp";
+ SvFileStream aStream(aURL, StreamMode::READ);
+ if (!aStream.IsOpen())
+ return;
+
+ xml::sax::InputSource aInputSource;
+ uno::Reference<io::XInputStream> xStream(new utl::OStreamWrapper(aStream));
+ aInputSource.aInputStream = xStream;
+ uno::Reference<xml::sax::XParser> xParser = xml::sax::Parser::create(xContext);
+ rtl::Reference<XMPParser> xXMP(new XMPParser(rMetaData));
+ uno::Reference<xml::sax::XDocumentHandler> xDocumentHandler(xXMP.get());
+ xParser->setDocumentHandler(xDocumentHandler);
+ try
+ {
+ xParser->parseStream(aInputSource);
+ }
+ catch (const uno::Exception&)
+ {
+ DBG_UNHANDLED_EXCEPTION("writerperfect", "parseStream() failed");
+ return;
+ }
+}
+
+/// Handler for <office:body>.
+class XMLBodyContext : public XMLImportContext
+{
+public:
+ XMLBodyContext(XMLImport& rImport);
+
+ rtl::Reference<XMLImportContext>
+ CreateChildContext(const OUString& rName,
+ const uno::Reference<xml::sax::XAttributeList>& /*xAttribs*/) override;
+};
+}
+
+XMLBodyContext::XMLBodyContext(XMLImport& rImport)
+ : XMLImportContext(rImport)
+{
+}
+
+rtl::Reference<XMLImportContext>
+XMLBodyContext::CreateChildContext(const OUString& rName,
+ const uno::Reference<xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ if (rName == "office:text")
+ return new XMLBodyContentContext(GetImport());
+ return nullptr;
+}
+
+namespace
+{
+/// Handler for <office:document>.
+class XMLOfficeDocContext : public XMLImportContext
+{
+public:
+ XMLOfficeDocContext(XMLImport& rImport);
+
+ rtl::Reference<XMLImportContext>
+ CreateChildContext(const OUString& rName,
+ const uno::Reference<xml::sax::XAttributeList>& /*xAttribs*/) override;
+
+ // Handles metafile for a single page.
+ void HandleFixedLayoutPage(const FixedLayoutPage& rPage, bool bFirst);
+};
+}
+
+XMLOfficeDocContext::XMLOfficeDocContext(XMLImport& rImport)
+ : XMLImportContext(rImport)
+{
+}
+
+rtl::Reference<XMLImportContext> XMLOfficeDocContext::CreateChildContext(
+ const OUString& rName, const uno::Reference<xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ if (rName == "office:meta")
+ return new XMLMetaDocumentContext(GetImport());
+ if (rName == "office:automatic-styles")
+ return new XMLStylesContext(GetImport(), XMLStylesContext::StyleType_AUTOMATIC);
+ if (rName == "office:styles")
+ return new XMLStylesContext(GetImport(), XMLStylesContext::StyleType_NONE);
+ if (rName == "office:master-styles")
+ return new XMLStylesContext(GetImport(), XMLStylesContext::StyleType_NONE);
+ if (rName == "office:font-face-decls")
+ return new XMLFontFaceDeclsContext(GetImport());
+ if (rName == "office:body")
+ {
+ if (GetImport().GetPageMetafiles().empty())
+ return new XMLBodyContext(GetImport());
+
+ // Ignore text from doc model in the fixed layout case, instead
+ // insert the page metafiles.
+ bool bFirst = true;
+ for (const auto& rPage : GetImport().GetPageMetafiles())
+ {
+ HandleFixedLayoutPage(rPage, bFirst);
+ if (bFirst)
+ bFirst = false;
+ }
+ }
+ return nullptr;
+}
+
+void XMLOfficeDocContext::HandleFixedLayoutPage(const FixedLayoutPage& rPage, bool bFirst)
+{
+ uno::Reference<uno::XComponentContext> xCtx = GetImport().GetComponentContext();
+ uno::Reference<xml::sax::XWriter> xSaxWriter = xml::sax::Writer::create(xCtx);
+ if (!xSaxWriter.is())
+ return;
+
+ uno::Sequence<uno::Any> aArguments = { uno::makeAny<uno::Sequence<beans::PropertyValue>>(
+ { comphelper::makePropertyValue("DTDString", false) }) };
+ uno::Reference<svg::XSVGWriter> xSVGWriter(
+ xCtx->getServiceManager()->createInstanceWithArgumentsAndContext(
+ "com.sun.star.svg.SVGWriter", aArguments, xCtx),
+ uno::UNO_QUERY);
+ if (!xSVGWriter.is())
+ return;
+
+ SvMemoryStream aMemoryStream;
+ xSaxWriter->setOutputStream(new utl::OStreamWrapper(aMemoryStream));
+
+ xSVGWriter->write(xSaxWriter, rPage.aMetafile);
+
+ // Have all the info, invoke the generator.
+ librevenge::RVNGPropertyList aPageProperties;
+ // Pixel -> inch.
+ double fWidth = rPage.aCssPixels.getWidth();
+ fWidth /= 96;
+ aPageProperties.insert("fo:page-width", fWidth);
+ double fHeight = rPage.aCssPixels.getHeight();
+ fHeight /= 96;
+ aPageProperties.insert("fo:page-height", fHeight);
+
+ if (!rPage.aChapterNames.empty())
+ {
+ // Name of chapters starting on this page.
+ librevenge::RVNGPropertyListVector aChapterNames;
+ for (const auto& rName : rPage.aChapterNames)
+ {
+ librevenge::RVNGPropertyList aChapter;
+ aChapter.insert("librevenge:name", rName.toUtf8().getStr());
+ aChapterNames.append(aChapter);
+ }
+ aPageProperties.insert("librevenge:chapter-names", aChapterNames);
+ }
+
+ GetImport().GetGenerator().openPageSpan(aPageProperties);
+ librevenge::RVNGPropertyList aParagraphProperties;
+ if (!bFirst)
+ // All pages except the first one needs a page break before the page
+ // metafile.
+ aParagraphProperties.insert("fo:break-before", "page");
+ GetImport().GetGenerator().openParagraph(aParagraphProperties);
+ librevenge::RVNGPropertyList aImageProperties;
+ aImageProperties.insert("librevenge:mime-type", "image/svg+xml");
+ librevenge::RVNGBinaryData aBinaryData;
+ aBinaryData.append(static_cast<const unsigned char*>(aMemoryStream.GetData()),
+ aMemoryStream.GetSize());
+ aImageProperties.insert("office:binary-data", aBinaryData);
+ GetImport().GetGenerator().insertBinaryObject(aImageProperties);
+ GetImport().GetGenerator().closeParagraph();
+ GetImport().GetGenerator().closePageSpan();
+}
+
+XMLImport::XMLImport(const uno::Reference<uno::XComponentContext>& xContext,
+ librevenge::RVNGTextInterface& rGenerator, const OUString& rURL,
+ const uno::Sequence<beans::PropertyValue>& rDescriptor,
+ const std::vector<FixedLayoutPage>& rPageMetafiles)
+ : mrGenerator(rGenerator)
+ , mxContext(xContext)
+ , mbIsInPageSpan(false)
+ , mrPageMetafiles(rPageMetafiles)
+{
+ uno::Sequence<beans::PropertyValue> aFilterData;
+ auto pDescriptor = std::find_if(
+ rDescriptor.begin(), rDescriptor.end(),
+ [](const beans::PropertyValue& rProp) { return rProp.Name == "FilterData"; });
+ if (pDescriptor != rDescriptor.end())
+ pDescriptor->Value >>= aFilterData;
+
+ maMediaDir = FindMediaDir(rURL, aFilterData);
+
+ OUString aMimeType;
+ OUString aCoverImage = FindCoverImage(rURL, aMimeType, aFilterData);
+ if (!aCoverImage.isEmpty())
+ {
+ librevenge::RVNGBinaryData aBinaryData;
+ SvFileStream aStream(aCoverImage, StreamMode::READ);
+ SvMemoryStream aMemoryStream;
+ aMemoryStream.WriteStream(aStream);
+ aBinaryData.append(static_cast<const unsigned char*>(aMemoryStream.GetData()),
+ aMemoryStream.GetSize());
+ librevenge::RVNGPropertyList aCoverImageProperties;
+ aCoverImageProperties.insert("office:binary-data", aBinaryData);
+ aCoverImageProperties.insert("librevenge:mime-type", aMimeType.toUtf8().getStr());
+ maCoverImages.append(aCoverImageProperties);
+ }
+
+ FindXMPMetadata(mxContext, rURL, aFilterData, maMetaData);
+
+ mxUriReferenceFactory = uri::UriReferenceFactory::create(mxContext);
+}
+
+const librevenge::RVNGPropertyListVector& XMLImport::GetCoverImages() const
+{
+ return maCoverImages;
+}
+
+const librevenge::RVNGPropertyList& XMLImport::GetMetaData() const { return maMetaData; }
+
+namespace
+{
+/// Finds out if a file URL exists.
+bool FileURLExists(const OUString& rURL)
+{
+ SvFileStream aStream(rURL, StreamMode::READ);
+ return aStream.IsOpen();
+}
+}
+
+PopupState XMLImport::FillPopupData(const OUString& rURL, librevenge::RVNGPropertyList& rPropList)
+{
+ uno::Reference<uri::XUriReference> xUriRef;
+ try
+ {
+ xUriRef = mxUriReferenceFactory->parse(rURL);
+ }
+ catch (const uno::Exception&)
+ {
+ DBG_UNHANDLED_EXCEPTION("writerperfect", "XUriReference::parse() failed");
+ }
+ bool bAbsolute = true;
+ if (xUriRef.is())
+ bAbsolute = xUriRef->isAbsolute();
+ if (bAbsolute)
+ return PopupState::NotConsumed;
+
+ // Default case: relative URL, popup data was in the same directory as the
+ // document at insertion time.
+ OUString aAbs = maMediaDir + rURL;
+ if (!FileURLExists(aAbs))
+ // Fallback case: relative URL, popup data was in the default media
+ // directory at insertion time.
+ aAbs = maMediaDir + "../" + rURL;
+
+ if (!FileURLExists(aAbs))
+ // Relative link, but points to non-existing file: don't emit that to
+ // librevenge, since it will be invalid anyway.
+ return PopupState::Ignore;
+
+ SvFileStream aStream(aAbs, StreamMode::READ);
+ librevenge::RVNGBinaryData aBinaryData;
+ SvMemoryStream aMemoryStream;
+ aMemoryStream.WriteStream(aStream);
+ aBinaryData.append(static_cast<const unsigned char*>(aMemoryStream.GetData()),
+ aMemoryStream.GetSize());
+ rPropList.insert("office:binary-data", aBinaryData);
+
+ INetURLObject aAbsURL(aAbs);
+ OUString aMimeType = GetMimeType(aAbsURL.GetFileExtension());
+ rPropList.insert("librevenge:mime-type", aMimeType.toUtf8().getStr());
+
+ return PopupState::Consumed;
+}
+
+const std::vector<FixedLayoutPage>& XMLImport::GetPageMetafiles() const { return mrPageMetafiles; }
+
+const uno::Reference<uno::XComponentContext>& XMLImport::GetComponentContext() const
+{
+ return mxContext;
+}
+
+rtl::Reference<XMLImportContext>
+XMLImport::CreateContext(const OUString& rName,
+ const uno::Reference<xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ if (rName == "office:document")
+ return new XMLOfficeDocContext(*this);
+ return nullptr;
+}
+
+librevenge::RVNGTextInterface& XMLImport::GetGenerator() const { return mrGenerator; }
+
+std::map<OUString, librevenge::RVNGPropertyList>& XMLImport::GetAutomaticTextStyles()
+{
+ return maAutomaticTextStyles;
+}
+
+std::map<OUString, librevenge::RVNGPropertyList>& XMLImport::GetAutomaticParagraphStyles()
+{
+ return maAutomaticParagraphStyles;
+}
+
+std::map<OUString, librevenge::RVNGPropertyList>& XMLImport::GetAutomaticCellStyles()
+{
+ return maAutomaticCellStyles;
+}
+
+std::map<OUString, librevenge::RVNGPropertyList>& XMLImport::GetAutomaticColumnStyles()
+{
+ return maAutomaticColumnStyles;
+}
+
+std::map<OUString, librevenge::RVNGPropertyList>& XMLImport::GetAutomaticRowStyles()
+{
+ return maAutomaticRowStyles;
+}
+
+std::map<OUString, librevenge::RVNGPropertyList>& XMLImport::GetAutomaticTableStyles()
+{
+ return maAutomaticTableStyles;
+}
+
+std::map<OUString, librevenge::RVNGPropertyList>& XMLImport::GetAutomaticGraphicStyles()
+{
+ return maAutomaticGraphicStyles;
+}
+
+std::map<OUString, librevenge::RVNGPropertyList>& XMLImport::GetTextStyles()
+{
+ return maTextStyles;
+}
+
+std::map<OUString, librevenge::RVNGPropertyList>& XMLImport::GetParagraphStyles()
+{
+ return maParagraphStyles;
+}
+
+std::map<OUString, librevenge::RVNGPropertyList>& XMLImport::GetCellStyles()
+{
+ return maCellStyles;
+}
+
+std::map<OUString, librevenge::RVNGPropertyList>& XMLImport::GetColumnStyles()
+{
+ return maColumnStyles;
+}
+
+std::map<OUString, librevenge::RVNGPropertyList>& XMLImport::GetRowStyles() { return maRowStyles; }
+
+std::map<OUString, librevenge::RVNGPropertyList>& XMLImport::GetTableStyles()
+{
+ return maTableStyles;
+}
+
+std::map<OUString, librevenge::RVNGPropertyList>& XMLImport::GetGraphicStyles()
+{
+ return maGraphicStyles;
+}
+
+std::map<OUString, librevenge::RVNGPropertyList>& XMLImport::GetPageLayouts()
+{
+ return maPageLayouts;
+}
+
+std::map<OUString, librevenge::RVNGPropertyList>& XMLImport::GetMasterStyles()
+{
+ return maMasterStyles;
+}
+
+void XMLImport::startDocument() { mrGenerator.startDocument(librevenge::RVNGPropertyList()); }
+
+void XMLImport::endDocument() { mrGenerator.endDocument(); }
+
+void XMLImport::startElement(const OUString& rName,
+ const uno::Reference<xml::sax::XAttributeList>& xAttribs)
+{
+ rtl::Reference<XMLImportContext> xContext;
+ if (!maContexts.empty())
+ {
+ if (maContexts.top().is())
+ xContext = maContexts.top()->CreateChildContext(rName, xAttribs);
+ }
+ else
+ xContext = CreateContext(rName, xAttribs);
+
+ if (xContext.is())
+ xContext->startElement(rName, xAttribs);
+
+ maContexts.push(xContext);
+}
+
+void XMLImport::endElement(const OUString& rName)
+{
+ if (maContexts.empty())
+ return;
+
+ if (maContexts.top().is())
+ maContexts.top()->endElement(rName);
+
+ maContexts.pop();
+}
+
+void XMLImport::characters(const OUString& rChars)
+{
+ if (maContexts.top().is())
+ maContexts.top()->characters(rChars);
+}
+
+void XMLImport::ignorableWhitespace(const OUString& /*rWhitespaces*/) {}
+
+void XMLImport::processingInstruction(const OUString& /*rTarget*/, const OUString& /*rData*/) {}
+
+void XMLImport::setDocumentLocator(const uno::Reference<xml::sax::XLocator>& /*xLocator*/) {}
+
+void XMLImport::HandlePageSpan(const librevenge::RVNGPropertyList& rPropertyList)
+{
+ OUString sMasterPageName;
+ OUString sLayoutName;
+
+ if (rPropertyList["style:master-page-name"])
+ sMasterPageName = OStringToOUString(
+ rPropertyList["style:master-page-name"]->getStr().cstr(), RTL_TEXTENCODING_UTF8);
+ else if (!GetIsInPageSpan())
+ sMasterPageName = "Standard";
+
+ if (sMasterPageName.getLength())
+ {
+ librevenge::RVNGPropertyList& rMasterPage = GetMasterStyles()[sMasterPageName];
+ if (rMasterPage["style:page-layout-name"])
+ {
+ sLayoutName = OStringToOUString(rMasterPage["style:page-layout-name"]->getStr().cstr(),
+ RTL_TEXTENCODING_UTF8);
+ }
+ }
+
+ if (sLayoutName.getLength())
+ {
+ librevenge::RVNGPropertyList& rPageLayout = GetPageLayouts()[sLayoutName];
+
+ if (GetIsInPageSpan())
+ GetGenerator().closePageSpan();
+
+ GetGenerator().openPageSpan(rPageLayout);
+ mbIsInPageSpan = true;
+ }
+}
+
+} // namespace writerperfect
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/xmlimp.hxx b/writerperfect/source/writer/exp/xmlimp.hxx
new file mode 100644
index 000000000..6994be472
--- /dev/null
+++ b/writerperfect/source/writer/exp/xmlimp.hxx
@@ -0,0 +1,161 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLIMP_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLIMP_HXX
+
+#include <map>
+#include <stack>
+#include <vector>
+
+#include <librevenge/librevenge.h>
+
+#include <com/sun/star/xml/sax/XDocumentHandler.hpp>
+
+#include <cppuhelper/implbase.hxx>
+#include <rtl/ref.hxx>
+#include <tools/gen.hxx>
+
+#include "xmlictxt.hxx"
+
+namespace com
+{
+namespace sun
+{
+namespace star
+{
+namespace beans
+{
+struct PropertyValue;
+}
+namespace uno
+{
+class XComponentContext;
+}
+namespace uri
+{
+class XUriReferenceFactory;
+}
+}
+}
+}
+
+namespace writerperfect
+{
+namespace exp
+{
+class XMLImportContext;
+
+/// Contains info about a fixed-layout page.
+struct FixedLayoutPage
+{
+ css::uno::Sequence<sal_Int8> aMetafile;
+ Size aCssPixels;
+ std::vector<OUString> aChapterNames;
+};
+
+/// States describing the result of a link -> popup conversion.
+enum class PopupState
+{
+ /// Conversion did not happen yet.
+ NONE,
+ /// The relative link was converted to a popup.
+ Consumed,
+ /// The absolute link was not handled.
+ NotConsumed,
+ /// The relative link is invalid and should be ignored.
+ Ignore
+};
+
+/// ODT export feeds this class to make librevenge calls.
+class XMLImport : public cppu::WeakImplHelper<css::xml::sax::XDocumentHandler>
+{
+ librevenge::RVNGTextInterface& mrGenerator;
+ std::stack<rtl::Reference<XMLImportContext>> maContexts;
+ std::map<OUString, librevenge::RVNGPropertyList> maAutomaticTextStyles;
+ std::map<OUString, librevenge::RVNGPropertyList> maTextStyles;
+ std::map<OUString, librevenge::RVNGPropertyList> maAutomaticParagraphStyles;
+ std::map<OUString, librevenge::RVNGPropertyList> maParagraphStyles;
+ std::map<OUString, librevenge::RVNGPropertyList> maAutomaticCellStyles;
+ std::map<OUString, librevenge::RVNGPropertyList> maCellStyles;
+ std::map<OUString, librevenge::RVNGPropertyList> maAutomaticColumnStyles;
+ std::map<OUString, librevenge::RVNGPropertyList> maColumnStyles;
+ std::map<OUString, librevenge::RVNGPropertyList> maAutomaticRowStyles;
+ std::map<OUString, librevenge::RVNGPropertyList> maRowStyles;
+ std::map<OUString, librevenge::RVNGPropertyList> maAutomaticTableStyles;
+ std::map<OUString, librevenge::RVNGPropertyList> maTableStyles;
+ std::map<OUString, librevenge::RVNGPropertyList> maAutomaticGraphicStyles;
+ std::map<OUString, librevenge::RVNGPropertyList> maGraphicStyles;
+ std::map<OUString, librevenge::RVNGPropertyList> maPageLayouts;
+ std::map<OUString, librevenge::RVNGPropertyList> maMasterStyles;
+ librevenge::RVNGPropertyListVector maCoverImages;
+ /// Author, date, etc -- overwrites what would be from the document out of the box.
+ librevenge::RVNGPropertyList maMetaData;
+ const css::uno::Reference<css::uno::XComponentContext>& mxContext;
+ css::uno::Reference<css::uri::XUriReferenceFactory> mxUriReferenceFactory;
+ OUString maMediaDir;
+ bool mbIsInPageSpan;
+ const std::vector<FixedLayoutPage>& mrPageMetafiles;
+
+public:
+ XMLImport(const css::uno::Reference<css::uno::XComponentContext>& xContext,
+ librevenge::RVNGTextInterface& rGenerator, const OUString& rURL,
+ const css::uno::Sequence<css::beans::PropertyValue>& rDescriptor,
+ const std::vector<FixedLayoutPage>& rPageMetafiles);
+
+ rtl::Reference<XMLImportContext>
+ CreateContext(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs);
+
+ librevenge::RVNGTextInterface& GetGenerator() const;
+ std::map<OUString, librevenge::RVNGPropertyList>& GetAutomaticTextStyles();
+ std::map<OUString, librevenge::RVNGPropertyList>& GetAutomaticParagraphStyles();
+ std::map<OUString, librevenge::RVNGPropertyList>& GetAutomaticCellStyles();
+ std::map<OUString, librevenge::RVNGPropertyList>& GetAutomaticColumnStyles();
+ std::map<OUString, librevenge::RVNGPropertyList>& GetAutomaticRowStyles();
+ std::map<OUString, librevenge::RVNGPropertyList>& GetAutomaticTableStyles();
+ std::map<OUString, librevenge::RVNGPropertyList>& GetAutomaticGraphicStyles();
+ std::map<OUString, librevenge::RVNGPropertyList>& GetTextStyles();
+ std::map<OUString, librevenge::RVNGPropertyList>& GetParagraphStyles();
+ std::map<OUString, librevenge::RVNGPropertyList>& GetCellStyles();
+ std::map<OUString, librevenge::RVNGPropertyList>& GetColumnStyles();
+ std::map<OUString, librevenge::RVNGPropertyList>& GetRowStyles();
+ std::map<OUString, librevenge::RVNGPropertyList>& GetTableStyles();
+ std::map<OUString, librevenge::RVNGPropertyList>& GetGraphicStyles();
+ std::map<OUString, librevenge::RVNGPropertyList>& GetPageLayouts();
+ std::map<OUString, librevenge::RVNGPropertyList>& GetMasterStyles();
+ const librevenge::RVNGPropertyListVector& GetCoverImages() const;
+ const librevenge::RVNGPropertyList& GetMetaData() const;
+ PopupState FillPopupData(const OUString& rURL, librevenge::RVNGPropertyList& rPropList);
+ const std::vector<FixedLayoutPage>& GetPageMetafiles() const;
+ const css::uno::Reference<css::uno::XComponentContext>& GetComponentContext() const;
+
+ bool GetIsInPageSpan() const { return mbIsInPageSpan; }
+ void HandlePageSpan(const librevenge::RVNGPropertyList& rPropertyList);
+
+ // XDocumentHandler
+ void SAL_CALL startDocument() override;
+ void SAL_CALL endDocument() override;
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+ void SAL_CALL endElement(const OUString& rName) override;
+ void SAL_CALL characters(const OUString& rChars) override;
+ void SAL_CALL ignorableWhitespace(const OUString& rWhitespaces) override;
+ void SAL_CALL processingInstruction(const OUString& rTarget, const OUString& rData) override;
+ void SAL_CALL
+ setDocumentLocator(const css::uno::Reference<css::xml::sax::XLocator>& xLocator) override;
+};
+
+} // namespace exp
+} // namespace writerperfect
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/xmlmetai.cxx b/writerperfect/source/writer/exp/xmlmetai.cxx
new file mode 100644
index 000000000..2e42f740f
--- /dev/null
+++ b/writerperfect/source/writer/exp/xmlmetai.cxx
@@ -0,0 +1,285 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xmlmetai.hxx"
+
+#include "xmlimp.hxx"
+
+using namespace com::sun::star;
+
+namespace writerperfect::exp
+{
+namespace
+{
+/// Handler for <dc:title>.
+class XMLDcTitleContext : public XMLImportContext
+{
+public:
+ XMLDcTitleContext(XMLImport& rImport, XMLMetaDocumentContext& rMeta);
+
+ void SAL_CALL characters(const OUString& rChars) override;
+
+private:
+ XMLMetaDocumentContext& mrMeta;
+};
+}
+
+XMLDcTitleContext::XMLDcTitleContext(XMLImport& rImport, XMLMetaDocumentContext& rMeta)
+ : XMLImportContext(rImport)
+ , mrMeta(rMeta)
+{
+}
+
+void XMLDcTitleContext::characters(const OUString& rChars)
+{
+ OString sCharU8 = OUStringToOString(rChars, RTL_TEXTENCODING_UTF8);
+ if (!mrMeta.GetPropertyList()["dc:title"])
+ mrMeta.GetPropertyList().insert("dc:title", librevenge::RVNGString(sCharU8.getStr()));
+}
+
+namespace
+{
+/// Handler for <dc:language>.
+class XMLDcLanguageContext : public XMLImportContext
+{
+public:
+ XMLDcLanguageContext(XMLImport& rImport, XMLMetaDocumentContext& rMeta);
+
+ void SAL_CALL characters(const OUString& rChars) override;
+
+private:
+ XMLMetaDocumentContext& mrMeta;
+};
+}
+
+XMLDcLanguageContext::XMLDcLanguageContext(XMLImport& rImport, XMLMetaDocumentContext& rMeta)
+ : XMLImportContext(rImport)
+ , mrMeta(rMeta)
+{
+}
+
+void XMLDcLanguageContext::characters(const OUString& rChars)
+{
+ OString sCharU8 = OUStringToOString(rChars, RTL_TEXTENCODING_UTF8);
+ if (!mrMeta.GetPropertyList()["dc:language"])
+ mrMeta.GetPropertyList().insert("dc:language", librevenge::RVNGString(sCharU8.getStr()));
+}
+
+namespace
+{
+/// Handler for <dc:date>.
+class XMLDcDateContext : public XMLImportContext
+{
+public:
+ XMLDcDateContext(XMLImport& rImport, XMLMetaDocumentContext& rMeta);
+
+ void SAL_CALL characters(const OUString& rChars) override;
+
+private:
+ XMLMetaDocumentContext& mrMeta;
+};
+}
+
+XMLDcDateContext::XMLDcDateContext(XMLImport& rImport, XMLMetaDocumentContext& rMeta)
+ : XMLImportContext(rImport)
+ , mrMeta(rMeta)
+{
+}
+
+void XMLDcDateContext::characters(const OUString& rChars)
+{
+ OString sCharU8 = OUStringToOString(rChars, RTL_TEXTENCODING_UTF8);
+ if (!mrMeta.GetPropertyList()["dc:date"])
+ mrMeta.GetPropertyList().insert("dc:date", librevenge::RVNGString(sCharU8.getStr()));
+}
+
+namespace
+{
+/// Handler for <meta:generator>.
+class XMLMetaGeneratorContext : public XMLImportContext
+{
+public:
+ XMLMetaGeneratorContext(XMLImport& rImport, XMLMetaDocumentContext& rMeta);
+
+ void SAL_CALL characters(const OUString& rChars) override;
+
+private:
+ XMLMetaDocumentContext& mrMeta;
+};
+}
+
+XMLMetaGeneratorContext::XMLMetaGeneratorContext(XMLImport& rImport, XMLMetaDocumentContext& rMeta)
+ : XMLImportContext(rImport)
+ , mrMeta(rMeta)
+{
+}
+
+void XMLMetaGeneratorContext::characters(const OUString& rChars)
+{
+ OString sCharU8 = OUStringToOString(rChars, RTL_TEXTENCODING_UTF8);
+ mrMeta.GetPropertyList().insert("meta:generator", librevenge::RVNGString(sCharU8.getStr()));
+}
+
+namespace
+{
+/// Handler for <meta:initial-creator>.
+class XMLMetaInitialCreatorContext : public XMLImportContext
+{
+public:
+ XMLMetaInitialCreatorContext(XMLImport& rImport, XMLMetaDocumentContext& rMeta);
+
+ void SAL_CALL characters(const OUString& rChars) override;
+
+private:
+ XMLMetaDocumentContext& mrMeta;
+};
+}
+
+XMLMetaInitialCreatorContext::XMLMetaInitialCreatorContext(XMLImport& rImport,
+ XMLMetaDocumentContext& rMeta)
+ : XMLImportContext(rImport)
+ , mrMeta(rMeta)
+{
+}
+
+void XMLMetaInitialCreatorContext::characters(const OUString& rChars)
+{
+ OString sCharU8 = OUStringToOString(rChars, RTL_TEXTENCODING_UTF8);
+ if (!mrMeta.GetPropertyList()["meta:initial-creator"])
+ mrMeta.GetPropertyList().insert("meta:initial-creator",
+ librevenge::RVNGString(sCharU8.getStr()));
+}
+
+XMLMetaDocumentContext::XMLMetaDocumentContext(XMLImport& rImport)
+ : XMLImportContext(rImport)
+{
+ librevenge::RVNGPropertyList::Iter it(GetImport().GetMetaData());
+ for (it.rewind(); it.next();)
+ m_aPropertyList.insert(it.key(), it()->clone());
+ m_aPropertyList.insert("librevenge:cover-images", GetImport().GetCoverImages());
+}
+
+rtl::Reference<XMLImportContext> XMLMetaDocumentContext::CreateChildContext(
+ const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ if (rName == "dc:title")
+ return new XMLDcTitleContext(GetImport(), *this);
+ if (rName == "dc:language")
+ return new XMLDcLanguageContext(GetImport(), *this);
+ if (rName == "dc:date")
+ return new XMLDcDateContext(GetImport(), *this);
+ if (rName == "meta:generator")
+ return new XMLMetaGeneratorContext(GetImport(), *this);
+ if (rName == "meta:initial-creator")
+ return new XMLMetaInitialCreatorContext(GetImport(), *this);
+ return nullptr;
+}
+
+void XMLMetaDocumentContext::endElement(const OUString& /*rName*/)
+{
+ GetImport().GetGenerator().setDocumentMetaData(m_aPropertyList);
+}
+
+XMPParser::XMPParser(librevenge::RVNGPropertyList& rMetaData)
+ : mrMetaData(rMetaData)
+{
+}
+
+XMPParser::~XMPParser() = default;
+
+void XMPParser::startDocument() {}
+
+void XMPParser::endDocument()
+{
+ if (!mrMetaData["dc:identifier"] && !m_aIdentifier.isEmpty())
+ mrMetaData.insert("dc:identifier", m_aIdentifier.toUtf8().getStr());
+ if (!mrMetaData["dc:title"] && !m_aTitle.isEmpty())
+ mrMetaData.insert("dc:title", m_aTitle.toUtf8().getStr());
+ if (!mrMetaData["meta:initial-creator"] && !m_aCreator.isEmpty())
+ mrMetaData.insert("meta:initial-creator", m_aCreator.toUtf8().getStr());
+ if (!mrMetaData["dc:language"] && !m_aLanguage.isEmpty())
+ mrMetaData.insert("dc:language", m_aLanguage.toUtf8().getStr());
+ if (!mrMetaData["dc:date"] && !m_aDate.isEmpty())
+ mrMetaData.insert("dc:date", m_aDate.toUtf8().getStr());
+}
+
+void XMPParser::startElement(const OUString& rName,
+ const uno::Reference<xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ if (rName == "dc:identifier")
+ m_bInIdentifier = true;
+ else if (rName == "dc:title")
+ m_bInTitle = true;
+ else if (rName == "dc:creator")
+ m_bInCreator = true;
+ else if (rName == "dc:language")
+ m_bInLanguage = true;
+ else if (rName == "dc:date")
+ m_bInDate = true;
+ else if (rName == "rdf:li")
+ {
+ if (m_bInTitle)
+ m_bInTitleItem = true;
+ else if (m_bInCreator)
+ m_bInCreatorItem = true;
+ else if (m_bInLanguage)
+ m_bInLanguageItem = true;
+ else if (m_bInDate)
+ m_bInDateItem = true;
+ }
+}
+
+void XMPParser::endElement(const OUString& rName)
+{
+ if (rName == "dc:identifier")
+ m_bInIdentifier = false;
+ else if (rName == "dc:title")
+ m_bInTitle = false;
+ else if (rName == "dc:creator")
+ m_bInCreator = false;
+ else if (rName == "dc:language")
+ m_bInLanguage = false;
+ else if (rName == "dc:date")
+ m_bInDate = false;
+ else if (rName == "rdf:li")
+ {
+ if (m_bInTitle)
+ m_bInTitleItem = false;
+ else if (m_bInCreator)
+ m_bInCreatorItem = false;
+ else if (m_bInLanguage)
+ m_bInLanguageItem = false;
+ else if (m_bInDate)
+ m_bInDateItem = false;
+ }
+}
+
+void XMPParser::characters(const OUString& rChars)
+{
+ if (m_bInIdentifier)
+ m_aIdentifier += rChars;
+ else if (m_bInTitleItem)
+ m_aTitle += rChars;
+ else if (m_bInCreatorItem)
+ m_aCreator += rChars;
+ else if (m_bInLanguageItem)
+ m_aLanguage += rChars;
+ else if (m_bInDateItem)
+ m_aDate += rChars;
+}
+
+void XMPParser::ignorableWhitespace(const OUString& /*rWhitespace*/) {}
+
+void XMPParser::processingInstruction(const OUString& /*rTarget*/, const OUString& /*rData*/) {}
+
+void XMPParser::setDocumentLocator(const uno::Reference<xml::sax::XLocator>& /*xLocator*/) {}
+
+} // namespace writerperfect::exp
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/xmlmetai.hxx b/writerperfect/source/writer/exp/xmlmetai.hxx
new file mode 100644
index 000000000..1f3e0d774
--- /dev/null
+++ b/writerperfect/source/writer/exp/xmlmetai.hxx
@@ -0,0 +1,89 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLMETAI_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLMETAI_HXX
+
+#include <librevenge/librevenge.h>
+
+#include "xmlictxt.hxx"
+
+namespace writerperfect
+{
+namespace exp
+{
+/// Handler for <office:meta>.
+class XMLMetaDocumentContext : public XMLImportContext
+{
+public:
+ XMLMetaDocumentContext(XMLImport& rImport);
+
+ librevenge::RVNGPropertyList& GetPropertyList() { return m_aPropertyList; }
+
+ rtl::Reference<XMLImportContext>
+ CreateChildContext(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+ void SAL_CALL endElement(const OUString& rName) override;
+
+private:
+ librevenge::RVNGPropertyList m_aPropertyList;
+};
+
+/// Parses an XMP file.
+class XMPParser : public cppu::WeakImplHelper<css::xml::sax::XDocumentHandler>
+{
+public:
+ explicit XMPParser(librevenge::RVNGPropertyList& rMetaData);
+ ~XMPParser() override;
+
+ // XDocumentHandler
+ void SAL_CALL startDocument() override;
+
+ void SAL_CALL endDocument() override;
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+ void SAL_CALL endElement(const OUString& rName) override;
+
+ void SAL_CALL characters(const OUString& rChars) override;
+
+ void SAL_CALL ignorableWhitespace(const OUString& aWhitespaces) override;
+
+ void SAL_CALL processingInstruction(const OUString& aTarget, const OUString& aData) override;
+
+ void SAL_CALL
+ setDocumentLocator(const css::uno::Reference<css::xml::sax::XLocator>& xLocator) override;
+
+private:
+ librevenge::RVNGPropertyList& mrMetaData;
+ bool m_bInIdentifier = false;
+ OUString m_aIdentifier;
+ bool m_bInTitle = false;
+ bool m_bInTitleItem = false;
+ OUString m_aTitle;
+ bool m_bInCreator = false;
+ bool m_bInCreatorItem = false;
+ OUString m_aCreator;
+ bool m_bInLanguage = false;
+ bool m_bInLanguageItem = false;
+ OUString m_aLanguage;
+ bool m_bInDate = false;
+ bool m_bInDateItem = false;
+ OUString m_aDate;
+};
+
+} // namespace exp
+} // namespace writerperfect
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/xmltbli.cxx b/writerperfect/source/writer/exp/xmltbli.cxx
new file mode 100644
index 000000000..0e5818f0b
--- /dev/null
+++ b/writerperfect/source/writer/exp/xmltbli.cxx
@@ -0,0 +1,254 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xmltbli.hxx"
+
+#include "txtparai.hxx"
+#include "xmlimp.hxx"
+#include "xmltext.hxx"
+
+#include <sal/log.hxx>
+
+using namespace com::sun::star;
+
+namespace writerperfect::exp
+{
+namespace
+{
+/// Handler for <table:table-row>.
+class XMLTableRowContext : public XMLImportContext
+{
+public:
+ XMLTableRowContext(XMLImport& rImport);
+
+ rtl::Reference<XMLImportContext>
+ CreateChildContext(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+ int GetColumn() const;
+ void SetColumn(int nColumn);
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+ void SAL_CALL endElement(const OUString& rName) override;
+
+private:
+ int m_nColumn = 0;
+};
+
+/// Handler for <table:cell>.
+class XMLTableCellContext : public XMLImportContext
+{
+public:
+ XMLTableCellContext(XMLImport& rImport, XMLTableRowContext& rRow);
+
+ rtl::Reference<XMLImportContext>
+ CreateChildContext(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+ void SAL_CALL endElement(const OUString& rName) override;
+
+private:
+ XMLTableRowContext& m_rRow;
+};
+}
+
+XMLTableCellContext::XMLTableCellContext(XMLImport& rImport, XMLTableRowContext& rRow)
+ : XMLImportContext(rImport)
+ , m_rRow(rRow)
+{
+}
+
+rtl::Reference<XMLImportContext> XMLTableCellContext::CreateChildContext(
+ const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ return CreateTextChildContext(GetImport(), rName);
+}
+
+void XMLTableCellContext::startElement(
+ const OUString& /*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
+{
+ librevenge::RVNGPropertyList aPropertyList;
+ for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
+ {
+ const OUString& rAttributeName = xAttribs->getNameByIndex(i);
+ const OUString& rAttributeValue = xAttribs->getValueByIndex(i);
+
+ if (rAttributeName == "table:style-name")
+ FillStyles(rAttributeValue, GetImport().GetAutomaticCellStyles(),
+ GetImport().GetCellStyles(), aPropertyList);
+ else
+ {
+ OString sName = OUStringToOString(rAttributeName, RTL_TEXTENCODING_UTF8);
+ OString sValue = OUStringToOString(rAttributeValue, RTL_TEXTENCODING_UTF8);
+ aPropertyList.insert(sName.getStr(), sValue.getStr());
+ }
+ }
+ aPropertyList.insert("librevenge:column", m_rRow.GetColumn());
+ GetImport().GetGenerator().openTableCell(aPropertyList);
+ m_rRow.SetColumn(m_rRow.GetColumn() + 1);
+}
+
+void XMLTableCellContext::endElement(const OUString& /*rName*/)
+{
+ GetImport().GetGenerator().closeTableCell();
+}
+
+namespace
+{
+/// Handler for <table:table-column>.
+class XMLTableColumnContext : public XMLImportContext
+{
+public:
+ XMLTableColumnContext(XMLImport& rImport, librevenge::RVNGPropertyListVector& rColumns);
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+private:
+ librevenge::RVNGPropertyListVector& m_rColumns;
+};
+}
+
+XMLTableColumnContext::XMLTableColumnContext(XMLImport& rImport,
+ librevenge::RVNGPropertyListVector& rColumns)
+ : XMLImportContext(rImport)
+ , m_rColumns(rColumns)
+{
+}
+
+void XMLTableColumnContext::startElement(
+ const OUString& /*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
+{
+ librevenge::RVNGPropertyList aPropertyList;
+ for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
+ {
+ const OUString& rAttributeName = xAttribs->getNameByIndex(i);
+ const OUString& rAttributeValue = xAttribs->getValueByIndex(i);
+
+ if (rAttributeName == "table:style-name")
+ FillStyles(rAttributeValue, GetImport().GetAutomaticColumnStyles(),
+ GetImport().GetColumnStyles(), aPropertyList);
+ }
+ m_rColumns.append(aPropertyList);
+}
+
+XMLTableRowContext::XMLTableRowContext(XMLImport& rImport)
+ : XMLImportContext(rImport)
+{
+}
+
+rtl::Reference<XMLImportContext> XMLTableRowContext::CreateChildContext(
+ const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ if (rName == "table:table-cell")
+ return new XMLTableCellContext(GetImport(), *this);
+ if (rName == "table:covered-table-cell")
+ {
+ ++m_nColumn;
+ GetImport().GetGenerator().insertCoveredTableCell(librevenge::RVNGPropertyList());
+ }
+ else
+ SAL_WARN("writerperfect", "XMLTableRowContext::CreateChildContext: unhandled " << rName);
+ return nullptr;
+}
+
+void XMLTableRowContext::startElement(
+ const OUString& /*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
+{
+ librevenge::RVNGPropertyList aPropertyList;
+ for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
+ {
+ const OUString& rAttributeName = xAttribs->getNameByIndex(i);
+ const OUString& rAttributeValue = xAttribs->getValueByIndex(i);
+
+ if (rAttributeName == "table:style-name")
+ FillStyles(rAttributeValue, GetImport().GetAutomaticRowStyles(),
+ GetImport().GetRowStyles(), aPropertyList);
+ }
+ GetImport().GetGenerator().openTableRow(aPropertyList);
+}
+
+void XMLTableRowContext::endElement(const OUString& /*rName*/)
+{
+ GetImport().GetGenerator().closeTableRow();
+}
+
+int XMLTableRowContext::GetColumn() const { return m_nColumn; }
+
+void XMLTableRowContext::SetColumn(int nColumn) { m_nColumn = nColumn; }
+
+XMLTableContext::XMLTableContext(XMLImport& rImport, bool bTopLevel)
+ : XMLImportContext(rImport)
+ , m_bTopLevel(bTopLevel)
+{
+}
+
+rtl::Reference<XMLImportContext> XMLTableContext::CreateChildContext(
+ const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ if (rName == "table:table-column")
+ // Make sure columns are parsed before we open the table.
+ return new XMLTableColumnContext(GetImport(), m_aColumns);
+
+ if (!m_bTableOpened)
+ {
+ if (!m_aColumns.empty())
+ m_aPropertyList.insert("librevenge:table-columns", m_aColumns);
+ GetImport().GetGenerator().openTable(m_aPropertyList);
+ m_bTableOpened = true;
+ }
+
+ if (rName == "table:table-row")
+ return new XMLTableRowContext(GetImport());
+
+ SAL_WARN("writerperfect", "XMLTableContext::CreateChildContext: unhandled " << rName);
+
+ return nullptr;
+}
+
+void XMLTableContext::startElement(
+ const OUString& /*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
+{
+ for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
+ {
+ const OUString& rAttributeName = xAttribs->getNameByIndex(i);
+ const OUString& rAttributeValue = xAttribs->getValueByIndex(i);
+
+ if (rAttributeName == "table:style-name")
+ {
+ FillStyles(rAttributeValue, GetImport().GetAutomaticTableStyles(),
+ GetImport().GetTableStyles(), m_aPropertyList);
+ if (m_bTopLevel)
+ GetImport().HandlePageSpan(m_aPropertyList);
+ }
+ else
+ {
+ OString sName = OUStringToOString(rAttributeName, RTL_TEXTENCODING_UTF8);
+ OString sValue = OUStringToOString(rAttributeValue, RTL_TEXTENCODING_UTF8);
+ m_aPropertyList.insert(sName.getStr(), sValue.getStr());
+ }
+ }
+}
+
+void XMLTableContext::endElement(const OUString& /*rName*/)
+{
+ if (m_bTableOpened)
+ {
+ GetImport().GetGenerator().closeTable();
+ }
+}
+
+} // namespace writerperfect::exp
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/xmltbli.hxx b/writerperfect/source/writer/exp/xmltbli.hxx
new file mode 100644
index 000000000..dff4dda2f
--- /dev/null
+++ b/writerperfect/source/writer/exp/xmltbli.hxx
@@ -0,0 +1,50 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLTBLI_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLTBLI_HXX
+
+#include <librevenge/librevenge.h>
+
+#include "xmlictxt.hxx"
+
+namespace writerperfect
+{
+namespace exp
+{
+/// Handler for <table:table>.
+class XMLTableContext : public XMLImportContext
+{
+public:
+ XMLTableContext(XMLImport& rImport, bool bTopLevel = false);
+
+ rtl::Reference<XMLImportContext>
+ CreateChildContext(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+
+ void SAL_CALL
+ startElement(const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
+ void SAL_CALL endElement(const OUString& rName) override;
+
+private:
+ bool m_bTableOpened = false;
+ /// If the context is a direct child of XMLBodyContentContext.
+ /// Only direct child of XMLBodyContentContext has to handle page span.
+ bool m_bTopLevel;
+ librevenge::RVNGPropertyList m_aPropertyList;
+ librevenge::RVNGPropertyListVector m_aColumns;
+};
+
+} // namespace exp
+} // namespace writerperfect
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/xmltext.cxx b/writerperfect/source/writer/exp/xmltext.cxx
new file mode 100644
index 000000000..01e185c43
--- /dev/null
+++ b/writerperfect/source/writer/exp/xmltext.cxx
@@ -0,0 +1,55 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xmltext.hxx"
+
+#include "txtparai.hxx"
+#include "xmltbli.hxx"
+#include "XMLSectionContext.hxx"
+#include "XMLTextListContext.hxx"
+#include "xmlimp.hxx"
+
+using namespace com::sun::star;
+
+namespace writerperfect::exp
+{
+XMLBodyContentContext::XMLBodyContentContext(XMLImport& rImport)
+ : XMLImportContext(rImport)
+{
+}
+
+void XMLBodyContentContext::endElement(const OUString& /*rName*/)
+{
+ if (GetImport().GetIsInPageSpan())
+ GetImport().GetGenerator().closePageSpan();
+}
+
+rtl::Reference<XMLImportContext> XMLBodyContentContext::CreateChildContext(
+ const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
+{
+ return CreateTextChildContext(GetImport(), rName, true);
+}
+
+rtl::Reference<XMLImportContext> CreateTextChildContext(XMLImport& rImport, const OUString& rName,
+ bool bTopLevel)
+{
+ if (rName == "text:p" || rName == "text:h")
+ return new XMLParaContext(rImport, bTopLevel);
+ if (rName == "text:section")
+ return new XMLSectionContext(rImport);
+ if (rName == "table:table")
+ return new XMLTableContext(rImport, bTopLevel);
+ if (rName == "text:list")
+ return new XMLTextListContext(rImport);
+ return nullptr;
+}
+
+} // namespace writerperfect::exp
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/xmltext.hxx b/writerperfect/source/writer/exp/xmltext.hxx
new file mode 100644
index 000000000..756a7ddbc
--- /dev/null
+++ b/writerperfect/source/writer/exp/xmltext.hxx
@@ -0,0 +1,40 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLTEXT_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLTEXT_HXX
+
+#include "xmlictxt.hxx"
+
+namespace writerperfect
+{
+namespace exp
+{
+/// Handler for <office:text>.
+class XMLBodyContentContext : public XMLImportContext
+{
+public:
+ XMLBodyContentContext(XMLImport& rImport);
+
+ rtl::Reference<XMLImportContext> CreateChildContext(
+ const OUString& rName,
+ const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/) override;
+ void SAL_CALL endElement(const OUString& rName) override;
+};
+
+/// Context factory for body text, section, table cell, etc.
+rtl::Reference<XMLImportContext> CreateTextChildContext(XMLImport& rImport, const OUString& rName,
+ bool bTopLevel = false);
+
+} // namespace exp
+} // namespace writerperfect
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/wpftwriter.component b/writerperfect/source/writer/wpftwriter.component
new file mode 100644
index 000000000..8ab436634
--- /dev/null
+++ b/writerperfect/source/writer/wpftwriter.component
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+-->
+<component loader="com.sun.star.loader.SharedLibrary" environment="@CPPU_ENV@"
+ xmlns="http://openoffice.org/2010/uno-components">
+ <implementation name="com.sun.star.comp.Writer.AbiWordImportFilter"
+ constructor="com_sun_star_comp_Writer_AbiWordImportFilter_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ <service name="com.sun.star.document.ExtendedTypeDetection"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Writer.MSWorksImportFilter"
+ constructor="com_sun_star_comp_Writer_MSWorksImportFilter_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ <service name="com.sun.star.document.ExtendedTypeDetection"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Writer.MWAWImportFilter"
+ constructor="com_sun_star_comp_Writer_MWAWImportFilter_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ <service name="com.sun.star.document.ExtendedTypeDetection"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Writer.WordPerfectImportFilter"
+ constructor="com_sun_star_comp_Writer_WordPerfectImportFilter_get_implementation">
+ <service name="com.sun.star.document.ExtendedTypeDetection"/>
+ <service name="com.sun.star.document.ImportFilter"/>
+ </implementation>
+ <implementation name="org.libreoffice.comp.Writer.EBookImportFilter"
+ constructor="org_libreoffice_comp_Writer_EBookImportFilter_get_implementation">
+ <service name="com.sun.star.document.ExtendedTypeDetection"/>
+ <service name="com.sun.star.document.ImportFilter"/>
+ </implementation>
+ <implementation name="org.libreoffice.comp.Writer.PagesImportFilter"
+ constructor="org_libreoffice_comp_Writer_PagesImportFilter_get_implementation">
+ <service name="com.sun.star.document.ExtendedTypeDetection"/>
+ <service name="com.sun.star.document.ImportFilter"/>
+ </implementation>
+ <implementation name="org.libreoffice.comp.Writer.StarOfficeWriterImportFilter"
+ constructor="org_libreoffice_comp_Writer_StarOfficeWriterImportFilter_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ <service name="com.sun.star.document.ExtendedTypeDetection"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Writer.EPUBExportFilter"
+ constructor="com_sun_star_comp_Writer_EPUBExportFilter_get_implementation">
+ <service name="com.sun.star.document.ExportFilter"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Writer.EPUBExportUIComponent"
+ constructor="com_sun_star_comp_Writer_EPUBExportUIComponent_get_implementation">
+ <service name="com.sun.star.ui.dialogs.FilterOptionsDialog"/>
+ </implementation>
+</component>
diff --git a/writerperfect/uiconfig/ui/exportepub.ui b/writerperfect/uiconfig/ui/exportepub.ui
new file mode 100644
index 000000000..2b737e6e0
--- /dev/null
+++ b/writerperfect/uiconfig/ui/exportepub.ui
@@ -0,0 +1,548 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="wpt">
+ <requires lib="gtk+" version="3.18"/>
+ <object class="GtkDialog" id="EpubDialog">
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="exportepub|EpubDialog">EPUB Export</property>
+ <property name="resizable">False</property>
+ <property name="modal">True</property>
+ <property name="default_width">0</property>
+ <property name="default_height">0</property>
+ <property name="type_hint">dialog</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area1">
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="ok">
+ <property name="label">gtk-ok</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="cancel">
+ <property name="label">gtk-cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="help">
+ <property name="label">gtk-help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ <property name="secondary">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="GtkFrame" id="general">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="border_width">6</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="top_padding">6</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkGrid" id="grid2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="versionft">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="exportepub|versionft">Version:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">versionlb</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="versionlb">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="active">0</property>
+ <items>
+ <item translatable="yes" context="exportepub|epub3">EPUB 3.0</item>
+ <item translatable="yes" context="exportepub|epub2">EPUB 2.0</item>
+ </items>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="splitlb">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="active">0</property>
+ <items>
+ <item translatable="yes" context="exportepub|splitpage">Page break</item>
+ <item translatable="yes" context="exportepub|splitheading">Heading</item>
+ </items>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="splitft">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="exportepub|splitft">Split method:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">splitlb</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="layoutft">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="exportepub|layoutft">Layout method:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">layoutlb</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="layoutlb">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="active">0</property>
+ <items>
+ <item translatable="yes" context="exportepub|layoutreflowable">Reflowable</item>
+ <item translatable="yes" context="exportepub|layoutfixed">Fixed</item>
+ </items>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="generalft">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="exportepub|generalft">General</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="metadata">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="border_width">6</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="top_padding">6</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkGrid" id="grid3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="identifierft">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="exportepub|identifierft">Identifier:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">identifier</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="titleft">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="exportepub|titleft">Title:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">title</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="authorft">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="exportepub|authorft">Author:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">author</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="dateft">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="exportepub|dateft">Date:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">date</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="languageft">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="exportepub|languageft">Language:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">language</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="identifier">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="title">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="author">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="language">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="date">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="metadataft">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="exportepub|metadataft">Metadata</property>
+ <property name="use_underline">True</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="customize">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="border_width">6</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="top_padding">6</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="coverimageft">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="exportepub|coverimageft">Cover image:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">coverpath</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="coverpath">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="coverbutton">
+ <property name="label" translatable="yes" context="exportepub|coverbutton">Browse...</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="mediadirft">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="exportepub|mediadirft">Media directory:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">mediadir</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="mediadir">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="mediabutton">
+ <property name="label" translatable="yes" context="exportepub|mediabutton">Browse...</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="customizeft">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="exportepub|customizeft">Customize</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-5">ok</action-widget>
+ <action-widget response="-6">cancel</action-widget>
+ <action-widget response="-11">help</action-widget>
+ </action-widgets>
+ </object>
+ <object class="GtkSizeGroup" id="sizegroup1">
+ <widgets>
+ <widget name="versionft"/>
+ <widget name="splitft"/>
+ <widget name="layoutft"/>
+ <widget name="identifierft"/>
+ <widget name="titleft"/>
+ <widget name="authorft"/>
+ <widget name="dateft"/>
+ <widget name="languageft"/>
+ <widget name="coverimageft"/>
+ <widget name="mediadirft"/>
+ </widgets>
+ </object>
+</interface>
diff --git a/writerperfect/uiconfig/ui/wpftencodingdialog.ui b/writerperfect/uiconfig/ui/wpftencodingdialog.ui
new file mode 100644
index 000000000..d0aff9435
--- /dev/null
+++ b/writerperfect/uiconfig/ui/wpftencodingdialog.ui
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="wpt">
+ <requires lib="gtk+" version="3.18"/>
+ <object class="GtkDialog" id="WPFTEncodingDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="resizable">False</property>
+ <property name="modal">True</property>
+ <property name="default_width">0</property>
+ <property name="default_height">0</property>
+ <property name="type_hint">dialog</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area1">
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="ok">
+ <property name="label">gtk-ok</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="has_default">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <property name="yalign">0.62000000476837158</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="cancel">
+ <property name="label">gtk-cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes" context="wpftencodingdialog|label">_Character set:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">comboboxtext</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="comboboxtext">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-5">ok</action-widget>
+ <action-widget response="-6">cancel</action-widget>
+ </action-widgets>
+ </object>
+</interface>